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.