![]() |
Access violation bei der Auflistung von Dateien
Warum kommt es bei der Funktion:
Delphi-Quellcode:
(stammt von
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec; Groesse : longint; begin Groesse:=0; if Verzeichnis[length(Verzeichnis)]<>'\' then Verzeichnis:=Verzeichnis+'\'; if FindFirst(Verzeichnis+'*.*',$3F,SR)=0 then begin repeat if ((SR.Attr and faDirectory)>0) and (SR.Name<>'.') and (SR.Name<>'..') then Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name) else Groesse:=Groesse+SR.Size; if (SR.Name<>'.') and (SR.Name<>'..') then FileListArray.Add(Verzeichnis+SR.Name); until FindNext(SR)<>0; FindClose(SR); end; Result:=Groesse; end; ![]() zu "Access violation" - Fehler sie wird mit:
Delphi-Quellcode:
aufgerufen. Der Ordner "Program Files" existiert und ist nicht leer.
self.caption := IntToStr(VerzGroesse('C:\Program Files\'))+' Byte';
|
Re: Access violation bei der Auflistung von Dateien
die einzige Stelle wo der Fehler auftreten kann ist bei
Delphi-Quellcode:
FileListArray ist vermutlich nicht initialisiert.
FileListArray.Add(Verzeichnis+SR.Name);
|
Re: Access violation bei der Auflistung von Dateien
Zitat:
|
Re: Access violation bei der Auflistung von Dateien
Hallo,
du solltest auch beachten, daß die Routine bei Verzeichnisgrößen ab 2 GB falsche Werte liefert, weil sie alle Berechnungen mit dem Typ longint durchführt. Damit auch größere Verzeichnisse verarbeitet werden können, muß zunächst überall "longint" durch "int64" ersetzt werden. Wird der Code mit einer Delphi-Version vor Delphi 2006 übersetzt, muß eine weitere Zeile angepaßt werden:
Delphi-Quellcode:
Gruß Hawkeye
// Groesse := Groesse + SR.Size;
Groesse := Groesse + Int64(SR.FindData.nFileSizeHigh) shl 32 + SR.FindData.nFileSizeLow; |
Re: Access violation bei der Auflistung von Dateien
Zitat:
Zählt TurboDelphi auch zu Delphi 2006? |
Re: Access violation bei der Auflistung von Dateien
Zitat:
|
Re: Access violation bei der Auflistung von Dateien
Moin fdsgbla,
mal abgesehen von dem 2GB Problem hat die Routine noch ein paar mehr:
Delphi-Quellcode:
Es sollte besser so (oder ähnlich aussehen):
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;
Delphi-Quellcode:
Wobei auch diese Variante möglich wäre
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;
Delphi-Quellcode:
da mehrere aufeinander folgende Pfadtrenner (\) nicht stören, so dass Verzeichnis auf \ enden, und man trotzdem die Suchmaske \*.* verwenden kann.
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; |
Re: Access violation bei der Auflistung von Dateien
Moin Chris,
Zitat:
Delphi-Quellcode:
Gruß Hawkeye
// Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name);
// FileListArray.Add(Verzeichnis+SR.Name); Groesse:=Groesse+VerzGroesse(Verzeichnis+'\'+SR.Name); FileListArray.Add(Verzeichnis+'\'+SR.Name); |
Re: Access violation bei der Auflistung von Dateien
Moin Hawkeye,
da hast Du auch wieder recht. :wall: |
Re: Access violation bei der Auflistung von Dateien
Nochmals Danke :wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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-2025 by Thomas Breitkreuz