Autor Beitrag
lkz633
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 136

WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
BeitragVerfasst: Sa 26.10.02 18:08 
Hallo,

habe ein komisches Problem. Ich suche mit folgendem code ini-Dateien:
ausblenden 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
;
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 26.10.02 19:51 
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:
ausblenden 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:
ausblenden 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
ausblenden Quelltext
1:
if length(results.Name)<=7 then					

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

Absoluter Fehler ist dies:
ausblenden 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
ausblenden Quelltext
1:
FindClose(Results);					

abschließen.

Wir lernen also folgendes daraus:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 136

WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
BeitragVerfasst: So 27.10.02 01: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