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:
...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.
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; 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. |
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:
Ist ungetestet, aber sollte etwas mehr Performance bringen. Naja, und ich schreibe Schlüsselwörter immer klein. Aber...
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; |
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:
dann
PROCEDURE GetAllFiles (Maske: STRING; Items, IgnoreDirs : TStrings; );
Delphi-Quellcode:
IgnoreDirs natürlich vorher mit UpperCased Pfaden füllen.
if IgnoreDirs.IndexOf(UpperCase(SFPath+Search.Name)) < 0 then
Items.Add(SFPath+Search.Name) 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. |
Re: Rekursive Dateisuche mit Verzeichnis-Filter?
:pale:
|
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