Moin fdsgbla,
mal abgesehen von dem 2GB Problem hat die Routine noch ein paar mehr:
Delphi-Quellcode:
function VerzGroesse(Verzeichnis:
string):longint;
var SR : TSearchRec;
Groesse : longint;
begin
Groesse:=0;
// Wenn Verzeichnis = '' => AV
if Verzeichnis[length(Verzeichnis)]<>'
\'
then
Verzeichnis:=Verzeichnis+'
\';
// Warum $3F, wenn es dafür eine Konstante gibt (faAnyfile)
if FindFirst(Verzeichnis+'
*.*',$3F,SR)=0
then begin
// Es fehlt try/finally um die Ausführung von FindClose abzusichern,
// wenn FindFirst erfolgreich war
repeat
// > 0 funktioniert hier zwar, besser ist aber <> 0
// oder = faDirectory. Der Wert könnte auch negativ sein
if ((SR.Attr
and faDirectory)>0)
and (SR.
Name<>'
.')
and (SR.
Name<>'
..')
then
Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.
Name)
else
Groesse:=Groesse+SR.Size;
// Da . und .. immer Verzeichnisse sind gehört das auch in die
// vorherige if-Abfrage
if (SR.
Name<>'
.')
and (SR.
Name<>'
..')
then
FileListArray.Add(Verzeichnis+SR.
Name);
until FindNext(SR)<>0;
FindClose(SR);
end;
Result:=Groesse;
end;
Es sollte besser so (oder ähnlich aussehen):
Delphi-Quellcode:
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec;
Groesse : longint;
begin
Groesse:=0;
if (Length(Verzeichnis) > 0) and Verzeichnis[length(Verzeichnis)]<>'\' then Verzeichnis:=Verzeichnis+'\';
if FindFirst(Verzeichnis+'*.*',faAnyFile,SR) = 0 then begin
try
repeat
if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then begin
Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name);
FileListArray.Add(Verzeichnis+SR.Name);
end else begin
Groesse:=Groesse+SR.Size;
end;
until FindNext(SR)<>0;
finally
FindClose(SR);
end;
end;
Result:=Groesse;
end;
Wobei auch diese Variante möglich wäre
Delphi-Quellcode:
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec;
Groesse : longint;
begin
Groesse:=0;
if FindFirst(Verzeichnis+'\*.*',faAnyFile,SR) = 0 then begin
try
repeat
if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then begin
Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name);
FileListArray.Add(Verzeichnis+SR.Name);
end else begin
Groesse:=Groesse+SR.Size;
end;
until FindNext(SR)<>0;
finally
FindClose(SR);
end;
end;
Result:=Groesse;
end;
da mehrere aufeinander folgende Pfadtrenner (\) nicht stören, so dass Verzeichnis auf \ enden, und man trotzdem die Suchmaske \*.* verwenden kann.