Moin Fabian,
Zitat von
xZise:
Ich weiß leider nicht, wie ich ein try/finally einbauen soll...
Macht er etwa ein "sr := TSearchRec.Create" im FindFirst?
Intern benutzt FindFirst die
API-Funktion FindFirstFile, und belegt, bei erfolgreichem Aufruf, ein
Handle.
Dieses muss man mit dem FindClose wieder freigeben.
So eine Routine könnte z.B. so aussehen:
Delphi-Quellcode:
procedure ReadFolder(const AsRoot : string;const AslResult : TStrings);
var
sr : TSearchRec;
begin
if FindFirst(AsRoot+'\*.*',faAnyFile,sr) <> 0 then exit;
try
repeat
if ((sr.Attr and faDirectory) = faDirectory) then begin
if (sr.Name <> '.') and (sr.Name <> '..') then begin
ReadFolder(AsRoot+'\'+sr.Name,AslResult);
end;
end else begin
AslResult.Add(AsRoot+'\'+sr.Name);
end;
until FindNext(sr) <> 0;
finally
FindClose(sr);
end;
end;
Zitat von
xZise:
Also mit dem Atribut "faDirectory" findet er trotzdem Dateien (Hä?)...
Ja, tut sie. FindFirstFile filtert nicht, und die Implementierung von FindFirst tut dies, entgegeben der Hilfe auch nicht.
Zitat von
xZise:
Was ist den Effektiver (@ Endung):
Eine If Abfrage oder Nur nach der Endung suchen?
Einmal durch die Verzeichnisse durchgehen, und anschliessend, immer wenn eine Datei gefunden wurde, auf die Endung zu prüfen ist auf jeden Fall einfacher zu schreiben.
Ansonsten müsstest Du bei jedem Verzeichnis, dass Du findest, noch einmal einen FindFirst/FindNext/FindClose-Block für die Endungen durchlaufen.
Welche von den beiden Methoden effektiver ist, kann ich allerdings auch nicht sagen.