![]() |
Rekursive Dateiensuche (mehrere Ordnerebenen)
Hi,
ich versuche gerade eine rekursive Funktion für ein Dateiensuche durch alle Unterordner des Startordners hinzukriegen. Nun habe ich folgende Unit geschrieben:
Delphi-Quellcode:
Die Prozedur "DeepSearch" ist nur zum testen geschrieben worden. Ich habe meine Photoalben (alles jpg) in RootDir kopiert. Aber die Zahl, die als Ergebnis (SLFiles.Count) ausgegeben wird, ist VIEL zu klein. Warum funktioniert die Rekursion nicht? Was muss ich ggf. korrigieren?
unit UDeepSearch;
interface uses Classes, QDialogs, QForms, SysUtils; procedure DeepSearch; function ScanFor(ADir, AMask: String): TStringList; const RootDir = 'C:\Program Files\Borland\Delphi6\Projects\DeepSearch\Test\'; implementation procedure DeepSearch; var SLFiles: TStringList; begin SLFiles := TStringList.Create; SLFiles.Clear; SLFiles.AddStrings(ScanFor(RootDir, '.jpg')); ShowMessage(IntToStr(SLFiles.Count)); SLFiles.Free; end; function ScanFor(ADir, AMask: String): TStringList; var SR: TSearchRec; begin Result.Clear; if FindFirst(ADir + '*.*', faAnyFile, SR) = 0 then begin repeat if (SR.Attr = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then Result.AddStrings(ScanFor(ADir + SR.Name + '\', AMask)) else if Pos(AMask, SR.Name) > 0 then Result.Add(ADir + SR.Name); until FindNext(SR) <> 0; FindClose(SR); end; end; end. |
Re: Rekursive Dateiensuche (mehrere Ordnerebenen)
Wo erstellst du die Stringliste, die scanfor zurückgibt?
Könntest du nicht die Stringliste als Parameter übergeben? Das würde solche Probleme vermeiden ;) |
Re: Rekursive Dateiensuche (mehrere Ordnerebenen)
Muss ich die StringList erstellen? Es kommen ja richtige Ergebnisse aus der Rekursion heraus - nur nicht aus allen Ordnern. Ich vermute, dass es irgendwie was mit dem SearchRec zu tun hat.
|
Re: Rekursive Dateiensuche (mehrere Ordnerebenen)
Delphi-Quellcode:
Jetzt funktioniert es. :cheers: Danke für den Hinweis, jfheins :cheers:
function ScanFor(ADir, AMask: String): TStringList;
var SR: TSearchRec; begin Result := TStringList.Create; Result.Clear; if FindFirst(ADir + '*.*', faAnyFile, SR) = 0 then //... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz