Bei meiner Suche nach einer guten Routine zur rekursiven Dateisuche bin ich über die Suchfunktion hier auf den Vorschlag von SirThornberry gestoßen, der einerseits schnell ist und andererseits auch (durch die Überprüfung mit Like()) die "Fehlfunde" (z.B. gesucht wird '*.fla', gefunden wird von FindFirst/Next auch 'test.flac') beseitigt:
Delphi-Quellcode:
procedure FindAllFiles (FileList: TStrings;
RootFolder: string;
Mask: string='*';
Recurse: Boolean=True;
AddFolderNames: Boolean=False;
IgnoreMaskAtFolderNames: Boolean=True);
procedure LFindAllFiles(aParentFolder: String);
var
SR: TSearchRec;
begin
if FindFirst(aParentFolder+'*', faAnyFile, SR) = 0 then begin
repeat
if (SR.Name <> '.') and (SR.Name <> '..') then begin
if (SR.Attr and faDirectory) = faDirectory then begin
if AddFolderNames and (IgnoreMaskAtFolderNames or Like(AnsiLowerCase(SR.Name),Mask)) then
FileList.AddObject(aParentFolder+SR.Name, TObject(True));
if Recurse then
LFindAllFiles(aParentFolder+SR.Name+'\');
end
else
if Like(AnsiLowerCase(SR.Name),Mask) then
FileList.AddObject(aParentFolder+SR.Name, TObject(False));
end;
until (FindNext(SR) <> 0);
FindClose(SR);
end;
end;
begin
Mask := AnsiLowerCase(Mask);
LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder));
end;
Desweiteren bin ich auf die Komponente "
DIFileFinder" gestoßen, die sehr interessant klingt:
Zitat:
Unlike most file finder components, DIFileFinder does not use events nor does it build lengthy file lists. Instead it reports a single file or folder at a time. This new architecture guarantees a maximum of flexibility using a minimum of resources only. Simply call the Next method each time another file entry is required. Next returns True for each file found, and the component can then be queried about the file details.
Dieser Ansatz hat mir sehr gut gefallen, denn man kann recht übersichtlich programmieren:
Delphi-Quellcode:
FFBasic.SearchFolder := edDirName.Text;
while FFBasic.Next do begin
Memo1.Lines.Add(FFBasic.FullName);
end;
Mein Vorschlag für eine Next-Methode (ohne Filterung der Dateinamen) wäre dann so was:
Delphi-Quellcode:
function TFileFinder.Next: Boolean;
begin
if (FFileCount = 0) then
result := (SysUtils.FindFirst(FSearchFolder+'*', faAnyFile, FSR) = 0)
else
result := (SysUtils.FindNext(FSR) = 0);
if result then begin
Inc(FFileCount);
FFileName := FSR.Name;
FFullName := FSearchFolder + FFileName;
end
else
SysUtils.FindNext(FSR);
end;
Problem: Mir will einfach kein sauberer Weg einfallen, wie man mit so einem Ansatz (und ohne eine interne Stringliste zu verwenden) das Ganze rekursiv auch in den Unterverzeichnissen suchen lassen kann?
Ich will hier auch nicht die €30 für die Komponente sparen; mich würde nur die (professionelle?) Lösung dieses Problems interessieren...
.sundance.