Hi !
Ich brauche für ein Programm eine Dateisuche, das mir beispielsweise alle Dateien mit der Endung TXT in einer ListBox anzeigt.
Mein Problem ist, das die Prozedur die ich gemacht habe, nicht alles findet.
Hier die Prozedur:
procedure TMainForm.SearchFile (Pfad: String);
var sr: TSearchRec;
r: Integer;
begin
r:= FindFirst(Pfad + \'\\*.*\', faAnyFile, sr);
while r = 0 do
begin
if Copy(sr.name, 1, 1) \'.\' then
begin
if (sr.attr0) and (faDirectory0) then
SearchFile(Pfad + \'\\\' + sr.name)
else
if Uppercase(System.Copy(sr.name, Pos(\'.\',sr.name), 4)) = \'.TXT\' then
ListBox.Items.Add(Pfad + \'\\\' + sr.name)
end;
Application.ProcessMessages;
r:=FindNext(sr);
end;
FindClose(sr);
end;
Ich verwende rekursive Programmierung. Meinen Fehler habe ich noch nicht entdeckt. Kann mir jemand helfen ?
Programmieren - alles kontrollieren 4.937 Themen, 20.662 Beiträge
Obgleich ich schon lange kein pascal(delphi) mehr gemacht habe, bin ich aber öfter mit dateisuchfunktionen beschäftigt und kenne einige der tücken (stichwort rekursion und suchmaske).
Davon unabhängig müssten einige codeteile aber anders aussehen:
if (sr.name = '.') or (sr.name = '.') then begin
wird zu
if (sr.name = '.') or (sr.name = '..') then begin
und
if (sr.attr and faDirectory) = sr.attr then
zu
if (sr.attr and faDirectory) 0 then
Meiner meinung nach sollte man auch getrennt nach verzeichnissen und datei suchen, da man dort die suchmasken gleich richtig setzen kann.
D.h.:
suche alle verzeichnisse mit *.* in diesem ordner und rekursiere jeweils hinein
suche danach alle dateien mit *.ext und kehre danach eine ebene zurück
Der grund ist, dass so die dateien eines ordners zusammen bleiben und nicht andere "tiefere" dateien sich in die liste dazwischen mischen.
mr.escape