Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Rekursive Dateisuche mit Grösse als Rückgabewert
Hellcode - Sa 08.10.05 14:11
Titel: Rekursive Dateisuche mit Grösse als Rückgabewert
Hallo,
Ich hoffe ich poste im richtigen Forum. Wenn nicht, einfach wegschieben. Also ich habe vor ein Programm zu schreiben, mit welchem man rekursiv nach Dateien suchen kann und zwar inkulsive Dateimaske, ect. Soweit kein Problem. Ich habe aber nur eine Prozedur gefunden mit der rekursiv gesucht werden kann, aber leider bekomme ich die Größe der gesamten gefundenen Dateien nicht heraus. Er gibt zwar etwas wieder. Aber der Wert ist definitiv zu hoch. Die Angabe müsste ja in Bytes sein..
Das ist die ursprüngliche Prozedur zum suchen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure GetFilesInDirectory(Directory: String; const Mask: String; List: TStrings; WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: String); var SR: TSearchRec; begin if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name) until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Ich habe schon versucht als Rückgabewert die Größe der gefundenen Dateien zu integrieren, aber so hat es nicht funktioniert. Wo ist der Fehler? Bin gerade ein wenig zerstreut. Wahrscheinlich ist es ganz einfach..
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| function GetFilesInDirectory(Directory: String; const Mask: String; List: TStrings; WithSubDirs, ClearList: Boolean):int64;
function ScanDir(const Directory: String):int64; var SR: TSearchRec; Groesse:int64; begin if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name); if ((SR.Attr and faDirectory)>0) and (SR.Name<>'.') and (SR.Name<>'..') then Groesse:=Groesse+SR.Size; until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; Result := Groesse; end;
var Groesse :int64; begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; Groesse := ScanDir(Directory); finally List.EndUpdate; end; Result := Groesse; end; |
So möchte ich die Größe erfassen und gleichzeitig die Dateien in einer Listbox haben (Das mit der Listbox funktioniert ja wie gesagt auch):
Delphi-Quelltext
1: 2:
| label1.caption := inttostr(GetFilesInDirectory('C:\', '*.exe',ListBox1.Items,false,false)); |
Auf C:\ (die Option "Unterverzeichnisse miteinbeziehen" ist ja ausgeschaltet) liegt genau eine EXE-Datei. Sie wird in der ListBox angezeigt. Sie ist ca. 222 kb groß. Nach dem Aufruf hat Label1 aber einen Wert von "5537201249105428"..
Kann jemand helfen? Danke im vorraus!!
Gruß,
HellCode
BenBE - Sa 08.10.05 14:37
Ich hab keine 10 Sekunden auf deinen Source gucken müssen, um den Fehler zu beheben.
Schau mal in dein Compiler-Fenster. Falls dort nix steht, schalt einfach mal die Compiler-Warnungen an, da müsste Dir ein Eintrag "Variable Groesse wahrscheinlich nicht initialisiert" auffallen.
Hellcode - Sa 08.10.05 14:47
ja hast recht. Aber jetzt hab ich eine Zeile über dem Funktionsaufruf "GetFilesInDirectory" Groesse auf 0 gesetzt, dann kommt auf einmal auch nur 0 raus. Ich glaube da ist doch noch etwas mehr faul in meinem code...
BenBE - Sa 08.10.05 14:55
In Zeile 25 weist Du die Größe des Unterverzeichnisses nicht zu.
Hellcode - Sa 08.10.05 15:40
Delphi-Quelltext
1:
| Groesse := Groesse + ScanDir(Directory + SR.Name + '\'); |
so? passiert nix. Oder hab ich das falsch verstanden?
BenBE - Sa 08.10.05 15:47
Zeile 25 stimmt so.
Wäre dann noch Zeile 13, wo
Delphi-Quelltext
13:
| { ... } if ((SR.Attr and faDirectory)>0) and (SR.Name<>'.') and (SR.Name<>'..') then |
in
Delphi-Quelltext
13:
| { ... } if ((SR.Attr and faDirectory)=0) and (SR.Name<>'.') and (SR.Name<>'..') then |
geändert werden müsste. Danach sollte es funzen (Hoff ich mal).
Hellcode - Sa 08.10.05 15:51
Super ich dank dir!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!