Delphi: Wo bitte liegt hier der Fehler?

Hallo!

Ich habe folgendes Problem:
Ich mochte Daten in eine Ini-Datei schreiben. Sollte die Datei bereits vorhanden sein, benenne ich sie von settings.ini in settings.bak um (die alte bak.Datei wird gelöscht) und erstelle eine neue.
Nun habe ich das Problem, dass die neue Datei ewig nicht auf die Festplatte geschrieben wird (dauert etwa 20(!!) Sekunden). Dannach ist sie erst da, wobei es jedoch die alte Datei zu sein scheint, wo die Anderungen nur hinzugefüght wurden. Wie kann das möglich sein, wo doch die alte Datei doch umbenannt wurde??
Ich kann absolut keinen Fehler finden!

Hier ist ein Ausschnitt des Codes:

try
// Create backup file
if fileexists(_file) then
begin
if fileexists(_filebak) then
if not deletefile(pchar(_FileBak)) then
begin
messagebox(0,’…’,‚Error‘,8192);
exit;
end;
renamefile(pchar(_file),pchar(_filebak));
end;
except
end;

try
ini := tinifile.create(_file);
with ini, do

ini.free;
except
ini.free;
end;

Und ein weiterer Fehler, der keiner sein dürfte…

listbox5.clear;
for i := 0 to list.count-1 do;
listbox5.Items.add(list[i]);

Dieser Code liefert bein ersten Durchlauf einen Indexüberlauf. Der Debugger meldet, dass i jedesmal einen konstanten Wert über 1000000 hat. Wie kann das möglich sein?

Bitte helft mir!

MFG, Volker

Kleine korrektur
Letzter Fehler hat sich erledigt… echt blöder Fehler…

Hallo!

Ich habe folgendes Problem:
Ich mochte Daten in eine Ini-Datei schreiben. Sollte die Datei
bereits vorhanden sein, benenne ich sie von settings.ini in
settings.bak um (die alte bak.Datei wird gelöscht) und
erstelle eine neue.
Nun habe ich das Problem, dass die neue Datei ewig nicht auf
die Festplatte geschrieben wird (dauert etwa 20(!!) Sekunden).
Dannach ist sie erst da, wobei es jedoch die alte Datei zu
sein scheint, wo die Anderungen nur hinzugefüght wurden. Wie
kann das möglich sein, wo doch die alte Datei doch umbenannt
wurde??
Ich kann absolut keinen Fehler finden!

Hier ist ein Ausschnitt des Codes:

try
// Create backup file
if fileexists(_file) then
begin
if fileexists(_filebak) then
if not deletefile(pchar(_FileBak)) then
begin
messagebox(0,’…’,‚Error‘,8192);
exit;
end;
renamefile(pchar(_file),pchar(_filebak));
end;
except
end;

try
ini := tinifile.create(_file);
with ini, do

ini.free;
except
ini.free;
end;

Bitte helft mir!

MFG, Volker

Hi Volker,
als erstes würde ich das Typecasting PCHAR() wegnehmen, da die Funktionen mit Strings arbeiten. Weiterhin fängst du das Umbenennen nicht wie das Löschen gegen einen IOError ab. Wenn die Datei nicht gelöscht werden, kann, dann nutzt die INI natürlich die Alte Datei. Da du zwar das ganze in einen Try/except block geschrieben hast nutzt nichts, das IOFehler keine Exceptions auslösen. Ausserdem würde ich in solch einer Verschachtelung nicht mit Exit rausgehen, das ist wie eine Vollbremsung von 100 auf 0.
Ich würds so machen:

  1. Original auf die .bak kopieren; wenn’s nicht geht,einfach in einer Schleife .BAK1 .BAK2 u.s.w. laufen lassen. Wäre aber merkwürdig wenn hier mehr als eine Datei enstehen würde, das würde bedeuten, das die datei gegen Schreibzugriffe immun ist :smile:
  2. Original öffnen und alle Sektionen löschen (EraseSection)
  3. Neue Sektionen schreiben.

Ich hoffe es hilft dir
Grüsse Mathias

Hallo!

Das ist ja das Problem!! Die Datei wird in die Bak-Datei umbenannt! Das Original existiert nicht mehr. Trotzdem finde ich immer noch die alten Daten darin, wenn ich sie neu erstelle.

MFG, Volker