Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.120 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 21:41
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat