Ich habe noch einen Verbesserungsvorschlag für die rekursive Suche nach Dateien (
CodeLib-Beitrag), und zwar das Suchen nach mehreren Masken.
Ich habe das Ganze so gelöst:
Delphi-Quellcode:
procedure FindAllFiles(const FileList: tstrings;RootFolder: string; Maske: array of string; Recurse: Boolean = True);
var
SR: TSearchRec;
i : integer;
begin
RootFolder := IncludeTrailingPathDelimiter(RootFolder);
if Recurse then
if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
try
repeat
if SR.Attr and faDirectory = faDirectory then
// --> ein Verzeichnis wurde gefunden
// der Verzeichnisname steht in SR.Name
// der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
// RootFolder + SR.Name
if (SR.Name <> '.') and (SR.Name <> '..') then
FindAllFiles(FileList, RootFolder + SR.Name, Maske, Recurse);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
i := 0;
repeat
begin
if FindFirst(RootFolder + '*' + Maske[i], faAnyFile, SR) = 0 then
try
repeat
if SR.Attr and faDirectory <> faDirectory then
begin
// --> eine Datei wurde gefunden
// der Dateiname steht in SR.Name
// der vollständige Dateiname (inkl. Pfadangabe) ist
// RootFolder + SR.Name
FileList.Add(RootFolder + SR.Name);
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
i := i + 1;
end
until
i = high(maske) + 1;
end;
Vergleichswerte:
- Partition mit 52.543 Dateien, 1949 Ordner
- gesucht wurden 11 Masken, insgesamt ~2634 relevante Dateien
- Methode mit 1 Maske, welche dann 11 mal mit untersch. Parametern ausgeführt wurde: 5 Sekunden
- Methode, in der alle Masken als Array übergeben werden: 2 Sekunden
P.S.: ich bin bei meinem Maskenarray davon ausgegangen, dass sie z.b. '.mp3' definiert werden. Daher wird im
if FindFirst(RootFolder + '*' + Maske[i], faAnyFile, SR) = 0 then
auch noch das Sternchen ('*') hinzugefügt.
[edit=Matze] Mfg, Matze[/edit]