Thema: Delphi Dateisuche - rekursiv

Einzelnen Beitrag anzeigen

Benutzerbild von sundance
sundance

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

Re: Dateisuche - rekursiv

  Alt 15. Dez 2009, 11: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