AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateisuche - rekursiv

Ein Thema von sundance · begonnen am 8. Dez 2009 · letzter Beitrag vom 15. Dez 2009
 
Benutzerbild von sundance
sundance

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

Dateisuche - rekursiv

  Alt 8. Dez 2009, 13: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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 by Thomas Breitkreuz