AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IniDateien

Ein Thema von colaflasche · begonnen am 24. Aug 2020 · letzter Beitrag vom 24. Aug 2020
Antwort Antwort
colaflasche

Registriert seit: 1. Jun 2007
33 Beiträge
 
#1

IniDateien

  Alt 24. Aug 2020, 14:52
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?
Gruß Jan

Geändert von colaflasche (24. Aug 2020 um 16:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#2

AW: IniDateien

  Alt 24. Aug 2020, 15:00
Moin...
Zitat:
Ini-Sektion danach zweimal in der selben Ini-Datei stand
Laß mal das UpdateFile einfach weg. Ist es dann besser? Inifile.WriteXXX schreibt auch auf die Platte.

Geändert von haentschman (24. Aug 2020 um 15:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: IniDateien

  Alt 24. Aug 2020, 15:03
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (24. Aug 2020 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#4

AW: IniDateien

  Alt 24. Aug 2020, 15:18
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
  Mit Zitat antworten Zitat
colaflasche

Registriert seit: 1. Jun 2007
33 Beiträge
 
#5

AW: IniDateien

  Alt 24. Aug 2020, 16:13
@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.
Gruß Jan
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#6

AW: IniDateien

  Alt 24. Aug 2020, 16:14
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#7

AW: IniDateien

  Alt 24. Aug 2020, 18:37
Laß mal das UpdateFile einfach weg. Ist es dann besser? Inifile.WriteXXX schreibt auch auf die Platte.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Aug 2020 um 18:39 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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