Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rekursive Dateisuche mit Verzeichnis-Filter? (https://www.delphipraxis.net/134279-rekursive-dateisuche-mit-verzeichnis-filter.html)

irrlicht 19. Mai 2009 05:37


Rekursive Dateisuche mit Verzeichnis-Filter?
 
Hallo an euch alle.

Wie man sieht bin ich ganz neu hier und schaue mir seit ein paar Tagen sourcecodes an und spiele mit ihnen herum. Mit dem Vorhaben so etwas daraus zu lernen :mrgreen:

So, und nun habe ich folgenden sorce für eine rekursive Dateisuche gecopiedingst...

Delphi-Quellcode:
PROCEDURE GetAllFiles (Maske: STRING; Items: TStrings);
CONST
FileAttr = faReadOnly+faHidden+faArchive+faNormal;
VAR
Search: TSearchRec;
SFName: STRING;
SFPath: STRING;
begin
SFName := ExtractFileName(Maske);
SFPath := ExtractFilePath(Maske);
IF SFPath[Length(SFPath)]<>'\' THEN SFPath := SFPath+'\';
// alle Dateien suchen
IF FindFirst(Maske, FileAttr, Search)=0 THEN
begin
REPEAT
begin
Items.Add(SFPath+Search.Name)
end
UNTIL FindNext(Search)<>0
end;
// Unterverzeichnisse durchsuchen
IF FindFirst(SFPath+'*.*',faDirectory,Search)=0 THEN
begin
REPEAT
begin
IF ((Search.Attr AND faDirectory)=faDirectory)
AND (Search.name[1]<>'.') THEN
begin
// Selbstaufruf von GetAllFiles
GetAllFiles(SFPath+Search.Name+'\'+SFName,Items_)
end
end
UNTIL FindNext(Search)<>0
end
end;
...und habe vor die Ergebnisse einzuschränken. Dateien die aus dem Windows- Program Files und Temp-Verzeichnis stammen, sollen "übersprungen" bzw. nicht in "Items" übergeben werden.

Yoaar theoretisch weiß ich was ich tun muss, doch praktisch.. :spin: :mrgreen: erstmal die Pfade der Verzeichnise ermitteln, hab ich. Anschließend eine if abfrage vor "Items.Add(SFPath+Search.Name)" einbauen, die SFPath überprüft o.o?
Hmmmm... und da hänge ich nun. Ich hab keine Ahnung wie ich die aussehen muss und wie ich diese dort einbauen kann :mrgreen:

Bin euch für jeden Tipp dankbar. Gruß, irrlicht.

wicht 19. Mai 2009 08:58

Re: Rekursive Dateisuche mit Verzeichnis-Filter?
 
Ich kann es hier jetzt nicht testen und habe auch nicht viel Zeit, aber als kleiner Tipp, benutze nur eine Schleife zum auflisten der Dateien, in etwa so:

Delphi-Quellcode:
if FindFirst(Maske, FileAttr, Search) = 0 then
begin
  repeat
    if (Search.Attr & faDirectory) == faDirectory then // geht das so, oder ist das zuviel des c? :)
      GetAllFiles(...)
    else
      Items.Add(SFPath + Search.Name);
  until FindNext(Search) <> 0
end;
Ist ungetestet, aber sollte etwas mehr Performance bringen. Naja, und ich schreibe Schlüsselwörter immer klein. Aber...

Satty67 19. Mai 2009 09:05

Re: Rekursive Dateisuche mit Verzeichnis-Filter?
 
Du könntest in einem 3. Parameter die verbotenen Verzeichnisse angeben, z.B. in einer weiteren StringList
Delphi-Quellcode:
PROCEDURE GetAllFiles (Maske: STRING; Items, IgnoreDirs : TStrings; );
dann
Delphi-Quellcode:
if IgnoreDirs.IndexOf(UpperCase(SFPath+Search.Name)) < 0 then
  Items.Add(SFPath+Search.Name)
IgnoreDirs natürlich vorher mit UpperCased Pfaden füllen.

zum jetzigen Code:

ich wurde Datei und Ordnersuche nicht in einer getrennten Schleife behandeln, sonder eine Schleife und bei Auftauchen eines Directory den "Selbstaufruf". €: Wicht hats auch schon erwähnt.

..und ohne Vorschriften machen zu wollen, wenigstens richtig einrücken sollte man den Code schon bei so vielen Blöcken.

irrlicht 21. Mai 2009 00:01

Re: Rekursive Dateisuche mit Verzeichnis-Filter?
 
:pale:

SirThornberry 21. Mai 2009 10:05

Re: Rekursive Dateisuche mit Verzeichnis-Filter?
 
@wicht: Da hast du wohl ein FindClose im Falle des erfolgreichen FindFirst vergessen ;-)


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