Entwickler-Ecke

Dateizugriff - findfirst,findnext findet nicht alle dateien


lkz633 - Sa 26.10.02 17:08
Titel: findfirst,findnext findet nicht alle dateien
Hallo,

habe ein komisches Problem. Ich suche mit folgendem code ini-Dateien:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 extensions:= tstringlist.Create;
  FindFirst('*.ini',faanyfile,Results);
  if length(results.Name)<=7 then begin
    delete(results.Name,pos('.',results.Name),4);
    extensions.Add(Results.Name);
  end;
  while findnext(Results)=0 do begin
    findnext(Results);
    if length(results.Name)<=7 then begin
      delete(results.Name,pos('.',results.Name),4);
      extensions.Add(Results.Name);
    end;
  end;


Mein Problem ist, dass er nicht alle ini-dateien einliesst, sondern nach einem von mir unerkenntlichen Prinzip. Wenn ich eine Ini-Datei loesche, findet er andere widerum, wenn ich eine andere hinzufüge, findet er andere nicht, andere schon.

Was mache ich falsch ?

Herlichen Dank und Gruss
lkz633
;


Delete - Sa 26.10.02 18:51
Titel: Re: findfirst,findnext findet nicht alle dateien
Es gibt mehrere Fehlerquellen in deinem Code -

Der erste hat mit dem Einlesen von INIs nichts zu tun, sondern betrifft die StringListe. Wird die anderweitig freigegeben (sicher),denn nur so ließe sich der fehlende try/finally-Block erklären. Ich gehe mal davon aus, ansonsten müsste dein "äußerer" Code so aussehen:

Quelltext
1:
2:
3:
4:
5:
6:
extensions := TStringList.Create;
try
  { ... }
finally
  extensions.Free;
end;

Nummer #2 wäre, dass du nicht wirklich prüfst, ob überhaupt eine INI-Datei vorhanden ist. Das Argument: "bei mir ist mindestens eine INI-Datei da", trifft vielleicht für dein System zu. Ein Anwender löscht möglicherweise die INIs in dem Verzeichnis, in dem dein Programm arbeitet.
Korrekter wäre also eine Prüfung wie:

Quelltext
1:
if FindFirst('*.ini',faAnyFile,Results) = 0) then ...                    

Ich persönlich bevorzuge eine integer-Variable und eine while-Schleife; aber das ist eine persönliche Sache, die ich noch aus alten TP-Tagen habe.

Eine mögliche Quelle des Versagens wäre die Einschränkung auf Dateinamen mit maximal 7 Zeichen. Was, wenn eine INI-Datei nun einen längeren Namen hat? In dem Fall trifft die Bedingung

Quelltext
1:
if length(results.Name)<=7 then                    

nicht mehr zu, und die Datei wird deiner Liste nicht hinzugefügt.

Absoluter Fehler ist dies:

Quelltext
1:
2:
3:
while findnext(Results)=0 do begin
  findnext(Results);
  { ... }

Zweimal "FindNext" hintereinander. Kein Wunder, dass dadurch Dateien verlorengehen.

Und zu guter Letzt sollte man eine Dateisuche immer mit

Quelltext
1:
FindClose(Results);                    

abschließen.

Wir lernen also folgendes daraus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
res := FindFirst('*.ini',faAnyFile,Results);
while(res = 0) do
  begin
    if(length(Results.Name) <= 7) then
      extensions.Add(ChangeFileExt(Results.Name,''));

    res := FindNext(Results);
  end;
FindClose(Results);


Bitteschön.
Gruß,

Mathias.


lkz633 - So 27.10.02 00:53

hallo mathias simmack,

danke für deine Mühe. An dem doppelten findnext lag es natürlich(Mit dem <= 7 stimmt so, dies ist Absicht)

Das freigeben der Ressourcen habe ich nur nicht gepostet, trotzdem nochmals danke für die übersichtliche Darstellung

MFG lkz633