Thema: Delphi Dateisuche - rekursiv

Einzelnen Beitrag anzeigen

Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#1

Dateisuche - rekursiv

  Alt 8. Dez 2009, 12:22
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.
  Mit Zitat antworten Zitat