PS: Habe gerade gesehen, dass diesen Vorschlag schon existiert.
Der Prozeduraufruf wird mit Stack implementiert.
Dies kannst Du auch selber nachmachen - dafür steht die Klasse TStack zur Verfügung. Natürlich ist normalerweise eine rekursive Funktion kürzer und einfacher zu programieren.
Ein schematischer Beispiel, der alle Dateien rekursiv (d.h. auch in Unterverzeichnisse) anzeigt:
Delphi-Quellcode:
procedure recurse_dirs(path : string);
var sr : TSearchRec;
begin
if FindFirst(path+PathDelim+'*.*', faAnyFile, sr) = 0 then begin
repeat
if (sr.Attr and faDirectory) = faDirectory then begin
if (sr.Name <> '.') and (sr.Name<>'..') then
recurse_dirs(path+PathDelim+sr.Name);
end else begin
showmessage(path+PathDelim+sr.Name);
end;
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
Kann folgendermassen ohne Rekursion geändert werden:
Delphi-Quellcode:
procedure iterate_dirs(startpath : string);
var sr : TSearchRec;
stack : TStack;
path : PAnsiChar;
subdir : PAnsiChar;
begin
stack:= TStack.Create;
path:= StrAlloc(length(startpath)+1);
StrPCopy(path, startpath);
stack.Push(path);
while stack.Count>0 do begin
path:= stack.pop;
if FindFirst(path+PathDelim+'*.*', faAnyFile, sr) = 0 then begin
repeat
if ((sr.Attr and faDirectory) = faDirectory) then begin
if (sr.Name <> '.') and (sr.Name<>'..') then begin
subdir:= StrAlloc(Length(path+PathDelim+sr.Name)+1);
StrPCopy(subdir, (path+PathDelim+sr.Name));
stack.push(subdir);
end;
end else begin
showmessage(path+PathDelim+sr.Name);
end;
until FindNext(sr) <> 0;
FindClose(sr);
end;
StrDispose(path);
end;
stack.Free;
end;
Natürlich ist die Ausgabereihenfolge unterschiedlich, die ist aber bei vielen Aufgaben egal. Hört sich an wie Breiten vs. Tiefensuche
Ist es auch dasselbe in dem Fall.
Zustand speichern in diesem Fall wäre einfach den Stack speichern... Das ist das Gute an dieser Methode.
Grüße,
Dimo