Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi IniDateien (https://www.delphipraxis.net/205303-inidateien.html)

colaflasche 24. Aug 2020 14:52

IniDateien
 
Guten Tag,

ich habe seit Jahr und Tag folgenden Code in meiner Anwendung um eine Inidatei zu schreiben (vereinfachte Darstellung). Der Code hat auch immer funktioniert.
Schreiben von Daten per TMemIniFile, dann schreiben von Daten per TINIFile. Warum auch immer man das so macht ist egal, es hat funktioniert.

Nun habe ich schon ein paar mal das PRoglem gehabt, dass es nicht mehr funktioniert hat und die Ini-Sektion danach zweimal in der selben Ini-Datei stand. Bei einem Kunden hat das jetzt auf 7 Rechner geklappt, auf 3 nicht. Zusätzlich habe ich das Problem bei 2 anderen Kunden festgestellt.

Code:
procedure TForm6.Button2Click(Sender: TObject);
var
  lDateiName: string;
  lMemInifile: TMemIniFile;
  lInifile: TIniFile;
begin
  lDateiName := '.\Meine.ini';
  lMemInifile := TMemIniFile.Create(lDateiName);
  try
    lMemInifile.WriteString('SEKTION', 'KEY1', 'VALUE1');
    lMemInifile.UpdateFile;
  finally
    FreeAndNil(lMemInifile);
  end;

  lInifile := TIniFile.Create(lDateiName);
  try
    lInifile.WriteString('SEKTION', 'KEY2', 'VALUE2');
  finally
    FreeAndNil(lInifile);
  end;
end;
Wenn ich den Code umstelle, so dass ausschließlich TMemIniFiles verwendet werden, habe ich das Problem nicht mehr:

Code:
procedure TForm6.Button2Click(Sender: TObject);
var
  lDateiName: string;
  lMemInifile: TMemIniFile;
  lInifile: TMemIniFile;
begin
  lDateiName := '.\Meine.ini';
  lMemInifile := TMemIniFile.Create(lDateiName);
  try
    lMemInifile.WriteString('SEKTION', 'TEST', 'VALUE1');
    lMemInifile.UpdateFile;
  finally
    FreeAndNil(lMemInifile);
  end;

  lInifile := TMemIniFile.Create(lDateiName);
  try
    lInifile.WriteString('SEKTION', 'TEST2', 'VALUE2');
    lInifile.UpdateFile;
  finally
    FreeAndNil(lInifile);
  end;
end;
Wie ich das löse ist mir klar, aber was mich interessieren würde, woher kommt das Problem so plötzlich? Wurde da durch ein Windows-Update was am Ini-File-Handling geändert? Ist da jemandem was bekannt?

haentschman 24. Aug 2020 15:00

AW: IniDateien
 
Moin...:P
Zitat:

Ini-Sektion danach zweimal in der selben Ini-Datei stand
Laß mal das
Delphi-Quellcode:
UpdateFile
einfach weg. Ist es dann besser?
Delphi-Quellcode:
Inifile.WriteXXX
schreibt auch auf die Platte.
:wink:

KodeZwerg 24. Aug 2020 15:03

AW: IniDateien
 
Mein erster Gedanke wäre, hat das Programm Rechte im ".\" Ordner zu schreiben? (Ich nutze dafür Roaming o.ä. Ordner)

//edit
ps: um zu testen ob's daran liegt, app per "als admin ausführen" starten, ini-zeug testen, klappt es dann liegts an deinem ".\" ort.

Rollo62 24. Aug 2020 15:18

AW: IniDateien
 
Warum machst Du das Ganze 2x direkt hintereinander, ist das nur ein Test ?
Wenn mehrere Änderungen da sind muss man nicht immer direkt speichern.

Könnte hier vielleicht ein seltsames Timing-Problem sein, wenn das File nicht schnell genug oder richtig freigegeben wird ?
Sollte aber eigentlich OK sein.

Ich benutze seit einiger Zeit ausschliesslich MemIniFile, weil damit die Beschränkungen von IniFile weg sind.
Bist Du sicher das es nicht z.B. an der 64K Genze (glaube ich, oder gibts noch andere) von IniMem liegen kann.
https://stackoverflow.com/questions/...ing-limitation

colaflasche 24. Aug 2020 16:13

AW: IniDateien
 
@haentschman: Sorry, klassischer Copy'n'paste-Fehler fürs Beispiel, im Original ist das nicht drinnen.

@KodeZwerg: Das hier habe ich nur als Vereinfachtes beispiel gemacht, im Original scheibe ich ebenfalls ins Roaming-Verzeichnis. Aber an ein Rechteproblem hatte ich zuerst ebenfalls gedacht, bis ich raus gefunden habe, das Variante 2 geht.

@Rollo62: Im Original ist das über mehrere Units verteilt, ist gewachsener Quelltext. Ich stelle aktuell auch alles auf die TMeminifile um. An irgenwelche Größen-Grenzen komme ich nicht.

Dalai 24. Aug 2020 16:14

AW: IniDateien
 
Hoffentlich ist dir bewusst, dass .\Meine.ini ein relativer Pfad ist, der vom aktuellen Arbeitsverzeichnis deiner Anwendung abhängt! Jeder Aufruf von SetCurrentDirectory und jeder Öffnen-/Speichern-Dialog ändert das Arbeitsverzeichnis. Ich halte es daher für essentiell, den Dateinamen - einmalig beim Programmstart - mit einem absoluten Pfad zusammenzubauen.

Grüße
Dalai

himitsu 24. Aug 2020 18:37

AW: IniDateien
 
Zitat:

Zitat von haentschman (Beitrag 1472336)
Laß mal das
Delphi-Quellcode:
UpdateFile
einfach weg. Ist es dann besser?
Delphi-Quellcode:
Inifile.WriteXXX
schreibt auch auf die Platte.
:wink:

Nee, eigentlich nicht.

Bei TIniFile wird die WinAPI genutzt und direkt im Write wird die INI gelesen, manipuliert und sofort geschrieben. (bei jedem einzelnem Zugriff)

TMemIniFile liest im Create die INI, das Write ändert es nur im RAM.
Gespeichert wird erst im UpdateFile oder beim Free/Destroy, wenn AutoSave=True.

Und AutoSave ist standardmäßig nur True, bei TIniFile (Ableitung von TMemIniFile) außerhalb von Windows. (iOS/Android/Linux)



Der relative Pfade sollte aber ungehend entsorgt werden,
denn das geht nicht vom Programmverzeichnis aus, sondern vom Arbeitsverzeichnis.
Einmal den FileOpen-/FileSaveDialog benutzt und schon war's das.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.

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