Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Dateien / Laufwerke (https://www.delphipraxis.net/41-library-dateien-laufwerke/)
-   -   Delphi Verzeichnisse nach Dateien durchsuchen (mehrere Masken) (https://www.delphipraxis.net/108297-verzeichnisse-nach-dateien-durchsuchen-mehrere-masken.html)

Aurelius 11. Feb 2008 06:58


Verzeichnisse nach Dateien durchsuchen (mehrere Masken)
 
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
Delphi-Quellcode:
if FindFirst(RootFolder + '*' + Maske[i], faAnyFile, SR) = 0 then
auch noch das Sternchen ('*') hinzugefügt.

[edit=Matze] Mfg, Matze[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz