Hallo,
ich benutze eine ini Datei um Einstellungen zu speichern (TMemIni). Das ganze klappt auch soweit. Hier ein Beispiel, ich arbeite mit try/except und try/finally da TMemIni. Da ich schon den Fehler hatte "kann nicht erzeugt werden da von einem anderen Prozess benutzt" noch die FileInUse Abfrage.
Delphi-Quellcode:
procedure TForm1.CheckBoxSwichResolutionClick(Sender: TObject);
var
s : String;
myIni : TMemIniFile;
begin
if bStartMerker then Exit;
if CheckBoxSwichResolution.Checked then s := 'TRUE' else s := 'FALSE';
WaitIfIniFileLocked;
try
myIni := TMemIniFile.Create(sPath + 'my.ini');
try
myIni.WriteString('DATA', 'SWITCHRESOLUTION', s);
myIni.UpdateFile;
finally
MyIni.Free;
end;
except
MyLogAdd('ERROR' + ',' + 'E=22', False);
end;
end;
function FileInUse(FileName: string): Boolean;
var hFileRes: HFILE;
begin
Result := false;
hFileRes := 0;
if NOT FileExists(FileName) then Exit;
try
hFileRes := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
Result := (hFileRes = INVALID_HANDLE_VALUE);
finally
if NOT Result then CloseHandle(hFileRes);
end;
end;
procedure TForm1.WaitIfIniFileLocked;
var
i : Integer;
begin
for i := 1 to 50 do begin
Application.ProcessMessages;
try
if FileInUse(sPath + 'my.ini') then begin
MyDelay(100);
end else begin
Exit;
end;
except
MyLogAdd('Error WaitIfIniFileLocked', False);
end;
end;
end;
Nun habe ich einen Kunden bei dem ca. alle 2 Wochen die INI Datei zerschossen ist. D.h. die INI ist normalerweise ca. 30 KB gross, und im Fehlerfall dann nur noch 100 Byte und der Rest an Daten fehlt einfach. Da bei Programmstart die Einstellungen aus der INI geladen werden, gibt es dann natürlich Probleme, da Variablen nicht vorhanden sind. Normalerweise passiert sowas ja nur, wenn z.B. während des Schreibvorganges der Strom ausfällt, dann ist klar das der Rest weg ist.
Irgendwelche Tips zu dem Thema kaputte INI? Warum passiert das "manchmal" (mein Lieblings Wort wenn es um bugs geht).