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
Antwort Antwort
Benutzerbild von sundance
sundance

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

Re: Dateisuche - rekursiv

  Alt 15. Dez 2009, 10:37
Hallo himitsu,

ich habe meine Next-Methode jetzt fertiggebastelt (der Übersichtlichkeit halber habe ich ein paar lokale Variablen zum Zwischenspeicher des Arrayindex und des Dateinamens verwendet); es ist jetzt doch keine reinrassige state-machine geworden.
Zum Start der Suche wird vorausgesetzt, dass dass dyn. Array FSR die Größe 1 hat, FNewLevel = true ist und in FCurrentDir das Startverzeichnis abgelegt ist:

Delphi-Quellcode:
function TFileFinder.Next: Boolean;
var
  searchOK: Boolean;
  fn: String;
  i,k: Integer;
begin
  i := High(FSR); // Aktuelle Verzeichnisebene über Array-Größe ermitteln
  repeat
    if (FNewLevel) then begin
      // Suche geht weiter/beginnt bei einem neuen Verzeichnis:
      searchOK := (FindFirst(FCurrentDir+'*', faAnyFile, FSR[i]) = 0);
      FNewLevel := false;
    end
    else
      // Suche geht weiter im letzten Verzeichnis:
      searchOK := (FindNext(FSR[i]) = 0);

    if searchOK then begin // Suche war erfolgreich...
      fn := FSR[i].Name;
      if (FSR[i].Attr and faDirectory <> 0) then begin
        // Verzeichnis gefunden:
        if (fn <> '.') and (fn <> '..') then begin
          StoreFileData(FSR[i]);
          if FRecursiveSearch then begin
            FNewLevel := true;
            Inc(i);
            SetLength(FSR,succ(i));
            FCurrentDir := FCurrentDir + fn + '\';
          end;
          if FIncludeFolderNames then Break;
        end;
      end
      else begin
        // Datei gefunden:
        if FileNameMatches(FSR[i]) then begin
          StoreFileData(FSR[i]);
          Inc(FFileCount);
          Break;
        end;
      end;
    end
    else begin // keine weiteren Verzeichniseinträge mehr vorhanden...
      FindClose(FSR[i]);
      Dec(i);
      SetLength(FSR,succ(i));
      FCurrentDir := FSearchFolder;
      for k:=0 to pred(i) do
        FCurrentDir := FCurrentDir + FSR[k].Name + '\';
    end;
    
  until (i < 0);
  result := (i >= 0);
end;
Wie du siehst, habe ich deine Ideen (kein Mitschreiben des aktuellen Verzeichnisses und kein blockweises Alloziieren des dynamischen Arrays) übernommen. Über die Funktion FileNameMatches() kann die gefundene Datei anhand beliebiger Kriterien (WildCard, Attribute, RegEx, Größe) überprüft werden.

Sobald meine Klasse TFileFinder ganz fertig ist, werde ich das hier mal posten...

.sundance.
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:01 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