Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EInifileException Fehler beim Schreiben der Inidatei (https://www.delphipraxis.net/161627-einifileexception-fehler-beim-schreiben-der-inidatei.html)

freedy 13. Jul 2011 11:04

EInifileException Fehler beim Schreiben der Inidatei
 
Hallo,

ich nutze schon seit einigen Jahren Ini-Dateien in meinem Programm, um die aktuellen Einstellungen (Fensterposition etc.) zu speichern. Seit ungefähr einer Woche bekomme ich beim Beenden des Programms einen Fehler, wenn die Ini-Datei geschrieben werden soll. Nachfolgender Codeauszug soll das Problem verdeutlichen:

Code:
var
  Ini : TInifile;
begin
  Ini := TInifile.Create(Inifilename); // Inifilename enthält einen definitiv gültigen Dateinamen
 
  Ini.WriteInteger('Form', 'Left', Left);
  Ini.WriteInteger('Form', 'Top', Top);
  Ini.WriteInteger('Form', 'Width', Width);

  Ini.WriteString('Form', 'Irgendwas', FIrgendwas);

  Ini.Free;
end;
Ich würde die Exception verstehen, wenn sie bei einem ungültigen Dateinamen aufträte. Der Fehler tritt aber zufällig bei einem der Schreibvorgänge auf (WriteInteger, WriteString), manchmal auch gar nicht.

Es scheint unabhängig von der Delphi-Version zu sein (getestet mit 2006 und XE), und es passiert bisher nur auf meinem Rechner (XP), hauptsächlich beim Testen aus der Entwicklungsumgebung heraus.

Gibt es andere, die ähnliche Probleme haben? Hat jemand eine Idee für einen Lösungsansatz? Die anderen Threads haben mir leider nicht wirklich geholfen. Einen doppelten Zugriff schließe ich mal aus. Die Ini-Datei sollte das doch an sich schon verhindern, oder?

Grüße
freedy

uligerhardt 13. Jul 2011 11:32

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Wenn ich im VCL-Quelltext nach EIniFileException suche, finde ich zwei Stellen, wo eine EIniFileException geworfen wird. Auf diese Zeilen würde ich je einen Haltepunkt setzen und, wenn dort angehalten wird, GetLastError anschauen (z.B.
Delphi-Quellcode:
SysErrorMessage(GetLastError)
im Auswerten/Ändern-Fenster (Strg-F7) eingeben).

HTH,
Uli.

s.h.a.r.k 13. Jul 2011 11:45

AW: EInifileException Fehler beim Schreiben der Inidatei
 
@uligerhardt: Wenn er die VCL debuggen will, dann muss er auch noch die Debug DCUs in den Projektoptionen unter dem Punkt Compilieren anschalten.

Des weiteren ist der Fehler auf ein Problem mit WritePrivateProfileString zurückzuführen und diese Methode wird unter EraseSection() bzw. unter WriteString() aufgerufen, was somit die Fehlerquelle schon mal ziemlich einschränkt.

Zitat:

Einen doppelten Zugriff schließe ich mal aus. Die Ini-Datei sollte das doch an sich schon verhindern, oder?
Doppelte Zugriffe im Sinne von Threads? Die VCL ist nicht threadsafe! Somit müsstest du das übernehmen.

uligerhardt 13. Jul 2011 12:21

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1111476)
@uligerhardt: Wenn er die VCL debuggen will, dann muss er auch noch die Debug DCUs in den Projektoptionen unter dem Punkt Compilieren anschalten.

Das hat man doch sowieso an, oder? :mrgreen:

EWeiss 13. Jul 2011 12:27

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Hatte das problem auch sehr oft allerdings unter Win7
Nachdem ich die Ini Dateien unter USER/..Roaming abgelegt habe hat sich das gegeben.

gruss

Gustav.R 13. Jul 2011 12:29

AW: EInifileException Fehler beim Schreiben der Inidatei
 
AntiVir aktiv?

Siehe http://forum.avira.com/wbb/index.php...hreadID=133224

GG

himitsu 13. Jul 2011 13:28

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Bei
Delphi-Quellcode:
Ini := TInifile.Create(Inifilename); // Inifilename enthält einen definitiv gültigen Dateinamen
kann definitiv niemals ein solcher Fehler aufteten.
(außer bei OutOfMemory ... also nichtmal mehr 8 Byte frei oder z.B. bei vorherrigen Speicherfehlern)

Wenn aber z.B. gleichzeitig ini.Write..., ini.Read... oder Dergleichen gleichzeitig auf die selbe Datei gehen, dann kann es schonmal knallen.
Genauso wenn keine Zugriffsrechte bestehen oder etwas Anderes den Zugriff blockt.

DeddyH 13. Jul 2011 13:49

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Es wäre vielleicht günstig gewesen, die Art der Exception zu nennen.

s.h.a.r.k 13. Jul 2011 14:21

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Zitat:

Zitat von DeddyH (Beitrag 1111507)
Es wäre vielleicht günstig gewesen, die Art der Exception zu nennen.

Meinst du den TE? Denn wenn ja, dann steht die Exception ja im Thread-Titel -> EIniFileException.

DeddyH 13. Jul 2011 14:23

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Jetzt, wo Du es sagst :oops:

Bjoerk 13. Jul 2011 14:32

AW: EInifileException Fehler beim Schreiben der Inidatei
 
TIniFile/ TMemIniFile benötigen die Datei exklusiv. Diese wird vermutlich aber von einem anderen Prozess benutzt.

Delphi-Quellcode:
procedure Wait (var N: integer);
var
  fTime: Cardinal;
begin
  fTime:= GetTickCount;
  repeat until (GetTickCount-fTime) > 500;
  N:= N+1;
end;


function IsFileReadyForOpen (const FileName: string): boolean;
var
  N, IO: integer;
  F: TextFile;
begin
  N:= 0;
  AssignFile(F, FileName);
  repeat
    {$I-} Reset(f); {$I+}
    IO:= IOResult;
    if IO <> 0 then Wait(N);
  until ((IO = 0) or (N = 10));
  Result:= (IO = 0);
  if Result then
    closeFile(f)
  else
    MessageDlg(Application.ExeName+': '+FileName+' ['+SysErrorMessage(IO)+'].', mtWarning, [mbOK], 0);
end;


var
  Ini : TInifile;
begin
  if not IsFileReadyForOpen (Inifilename) then Exit;

DeddyH 13. Jul 2011 14:41

AW: EInifileException Fehler beim Schreiben der Inidatei
 
Wie schon erwähnt wurde ruft WriteString auch nur WritePrivateProfileString auf. Im MSDN findet sich dann Folgendes dazu:
Zitat:

Return Value

If the function successfully copies the string to the initialization file, the return value is nonzero.

If the function fails, or if it flushes the cached version of the most recently accessed initialization file, the return value is zero. To get extended error information, call GetLastError.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz