![]() |
Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Hallo Zusammen,
die Function habe ich bis jetzt eingesetzt um die Verzeichnisgröße herauszufinden. Das funktioniert solange keine Datei größer ist als 2GB weil rec.Size ein Integer ist. Ich habe Verzeichnisse die grössere Dateien enthalten z.B.: Image Files aus der Datensicherung. Mit rec.Size bekomme ich natürlich Müll geliefert. Kennt Jemand eine andere Möglichkeit die Verzeichnisgröße abzufragen?
Delphi-Quellcode:
{-----------------------------------------------------------}
{}function GetDirSize(dir: string; subdir: Boolean): Int64; {-----------------------------------------------------------} //label1.Caption := FloatToStr(GetDirSize('e:\download', False) / Sqr(1024)) + ' MBytes'; var rec: TSearchRec; found: Integer; begin Result := 0; if dir[Length(dir)] <> '\' then dir := dir + '\'; found := FindFirst(dir + '*.*', faAnyFile, rec); while found = 0 do begin Inc(Result, rec.Size); if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') and (subdir = True) then Inc(Result, GetDirSize(dir + rec.Name, True)); found := FindNext(rec); end; FindClose(rec); end;{GetDirSize} Gruß Kostas |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Moin Kostas,
schau Dir mal TSearchRec.FindData an. BTW:
Delphi-Quellcode:
ist falsch. Man muss explizit auf <> '.' und <> '..' prüfen, da Verzeichnis- und Dateinamen auch mit einem Punkt beginnen können.
(rec.Name[1] <> '.')
|
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Zitat:
Gruß Kostas |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
|
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Hi,
So sollte es gehen:
Delphi-Quellcode:
{-----------------------------------------------------------}
{}function GetDirSize(dir: string; subdir: Boolean): Int64; {-----------------------------------------------------------} //label1.Caption := FloatToStr(GetDirSize('e:\download', False) / Sqr(1024)) + ' MBytes'; var rec: TSearchRec; found: Integer; iSize : int64: begin Result := 0; if dir[Length(dir)] <> '\' then dir := dir + '\'; found := FindFirst(dir + '*.*', faAnyFile, rec); while found = 0 do begin Int64Rec(iSize).Hi := Rec.FindData.nFileSizeHigh; Int64Rec(iSize).Lo := Rec.FindData.nFileSizeLow; Inc(Result, iSize); if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') and (subdir = True) then Inc(Result, GetDirSize(dir + rec.Name, True)); found := FindNext(rec); end; FindClose(rec); end;{GetDirSize} |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Korrektur...
Delphi-Quellcode:
{-----------------------------------------------------------}
function GetDirSize(dir: string; subdir: Boolean): Int64; {-----------------------------------------------------------} var rec: TSearchRec; found: Integer; iSize : int64: begin Result := 0; if dir[Length(dir)] <> '\' then dir := dir + '\'; found := FindFirst(dir + '*.*', faAnyFile, rec); while found = 0 do begin Int64Rec(iSize).Hi := Rec.FindData.nFileSizeHigh; Int64Rec(iSize).Lo := Rec.FindData.nFileSizeLow; Inc(Result, iSize); if (rec.Attr and faDirectory > 0) and (rec.Name <> '.') and (rec.Name <> '..') and subdir then begin Inc(Result, GetDirSize(dir + rec.Name, True)); end; found := FindNext(rec); end; FindClose(rec); end; {GetDirSize} |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Oder als Einzeiler:
Delphi-Quellcode:
var
iSize : int64: begin // ... iSize := int64(Rec.FindData.nFileSizeHigh) shl 32 + Rec.FindData.nFileSizeLow; // ... end; |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Perfekt Leute,
und schon wieder ein Sieg Ein herzliches Dankeschön. Gruß Kostas |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Delphi-Quellcode:
if ((rec.Attr and faDirectory > 0).. // so sollte man das Bit nicht abfragen
// falls man das höchstwertige Bit abfragt, wird das Ergebnis negativ // daher: if ((rec.Attr and faDirectory <> 0).. |
Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
Ich hätte es sogar so gemacht:
Delphi-Quellcode:
Siehe dazu auch hier:
if ((rec.Attr and faDirectory = faDirectory)..
![]() Es handelt sich nämlich bei den Attributen um eine Bit-Maske. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz