Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   FindFirstFile: Mit Maske in Unterverzeichnissen suchen? (https://www.delphipraxis.net/164691-findfirstfile-mit-maske-unterverzeichnissen-suchen.html)

Dawn87 25. Nov 2011 09:05

FindFirstFile: Mit Maske in Unterverzeichnissen suchen?
 
Guten Morgen,

ich muss zurzeit folgende Aufgabe lösen:

Vom Anwender bekomme ich den Pfad zu einer Ordnerstruktur, die in den meisten Fällen auch Unterordner enthält. Irgendwo in dieser Struktur muss eine Datei von einem bestimmten Typ liegen, damit diese Auswahl von meiner Anwendung akzeptiert wird.

Die Überprüfung ob eine Datei von diesem Typ vorhanden ist, habe ich mit einer rekursiven Funktion die intern FindFirstFile und FindNextFile nutzt, implementiert. Das Funktioniert auch, solange auf der ersten Ordnernebene eine Datei vorhanden ist die der Dateimaske ("*.abc"), die ich FindFirstFile() übergeben habe, entspricht.

Wenn in einem Unterverzeichnis diese Datei vorhanden ist, liefert FindFirstFile den Wert INVALID_HANDLE_VALUE.

Eine Möglichkeit das Problem zu lösen, wäre als Dateimaske "*.*" anzugeben und die Suchergebnisse per ExtractFileExt() selbst zu filtern. Das dauert aber länger und ist von Codee-Estetik her eher keine Mona Lisa.

Mein Problem wäre auch gelöst, wenn FindFirstFile einfach nur die Unterordner zurückliefern würde, auch wenn keine Datei vorhanden ist. Ich kenne aber keine Möglichkeit die Funktion entsprechend zu parametisieren.

Für Lösungsvorschläge bin ich dankbar. Unter allen Antwortenden verlose ich ein paar Smilies! :P

Beste Grüße,
Stefan

himitsu 25. Nov 2011 09:29

AW: FindFirstFile: Mit Maske in Unterverzeichnissen suchen?
 
Delphi-Referenz durchsuchenFindFirst/MSDN-Library durchsuchenFindFirstFile sucht nunmal nur in dem angegebenen Verzeichnis und nicht in Unterverzeichnissen.

Es gibt also zwei grundsätzliche Wege:
- die Verzeichnisse mit *.* durchsuchen und die Dateien nochmal selber auf diese maske zu Vergleichen, gefundene Unterverzeichnisse dann jeweils ebenfalls dieser Suche zu unterwerfen usw.
- erstmal mit dem angegebenen Suchmuster die nur Dateien suchen, anschließend nochmals mit *.* nur die Verzeicnisse suchen und jeweils in diesen ebenfalls die Suche neu beginnen.

Oder einfach mal nach FindAllFiles suchen, was einem übrigens auch die DP-Suchfunktion und Google genannte hätten, wenn man z.B. mal nach "Dateien suchen in allen Unterverzeichnissen" oder "Datei suchen Unterverzeichnisse" gesucht hätte. :angle2:

Sir Rufo 25. Nov 2011 09:41

AW: FindFirstFile: Mit Maske in Unterverzeichnissen suchen?
 
Meistens gibt es immer mindestens drei Wege :mrgreen:
(himi hatte drei Wege beschrieben, und das hier ist der 2. Weg, den er vorgeschlagen hatte :oops: )

Hier der dritte Weg:
Delphi-Quellcode:
procedure FindFiles( const Path, Filter : string; const Results : TStrings; Recurse : Boolean = False );
begin
  // Wir suchen mal nach den Dateien wie gewohnt mit FindFirst/FindNext/FindClose
  ...
  // ok, alle gefundenen Dateien sollten jetzt in Results liegen

  // Sollen wir die Verzeichnisse auch noch durchsuchen?
  if Recurse then
  begin
    // Jetzt suchen wir ausschließlich nach Verzeichnissen
    if FindFirst( Path, ... ) = 0 then
    try
      repeat
        // Rekursiver Aufruf dieser procedure
        FindFiles( IncludeTrailingPathDelimiter( Path ) + SearchRec.Name, Filter, Results, Recurse );
      until FindNext( SearchRec ) <> 0;
    finally
      FindClose( SearchRec );
    end;
  end;
end;

Dawn87 25. Nov 2011 10:23

AW: FindFirstFile: Mit Maske in Unterverzeichnissen suchen?
 
Hallo,

Danke für die Antworten. Ich denke das bringt mich weiter.

grüße
Stefan

jaenicke 25. Nov 2011 10:25

AW: FindFirstFile: Mit Maske in Unterverzeichnissen suchen?
 
Hier findest du einen Quelltext von mir, der auch mehrere Masken und Ausschlussmasken usw. unterstützt:
http://www.delphi-library.de/viewtopic.php?p=654795
Am Ende findest du auch eine Liste weiterer ähnlicher Quelltexte. Da sollte etwas Passendes dabei sein. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 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