Einzelnen Beitrag anzeigen

Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#1

Verzeichnisse nach Dateien durchsuchen (mehrere Masken)

  Alt 11. Feb 2008, 06:58
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]
Jonas
  Mit Zitat antworten Zitat