AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)
Thema durchsuchen
Ansicht
Themen-Optionen

Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

Ein Thema von CodeX · begonnen am 8. Jan 2016 · letzter Beitrag vom 12. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2      
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#1

Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 8. Jan 2016, 17:21
Delphi-Version: XE
Ich nutze in meiner Software eine abgeleitete Version von TMemIniFile zum Arbeiten mit Ini-Dateien. Das funktioniert eigentlich auch absolut problemlos. Allerdings gibt es wohl irgendeine Konstellation, die dazu führt, dass der Inhalt der Ini-Datei verloren geht.
Ein Anwender berichtet, dass das bei ihm alle paar Wochen nach dem Neustarten der Fall ist (Software läuft minimiert beim Herunterfahren und startet sich nach der Windowsanmeldung automatisch). Ein zweiter Anwender berichtete, dass dies bei ihm ein Mal passiert ist, als der Rechner während der Verwendung der Software abgestützt ist (hatte nichts mit der Software zu tun und der Ini-Verlust ist nach langer Verwendung erst ein Mal aufgetreten. Da die Datei nach dem Programmstart automatisch erstellt wird, kann ich nicht sagen, ob die ganze Datei weg ist oder "nur" komplett geleert.

Nun bin ich leider etwas ratlos, wie es dazu kommen kann. Da dies so extrem selten auftritt, könnte es sich um ein ganz blödes Timing handeln: TMemIniFile beginnt bei ini.Free den Schreibvorgang (wo aller Inhalt auf ein Mal in die Datei geschrieben wird, also muss sie vermutlich auch erstmal geleert werden), Rechner geht plötzlich aus, ini-Datei leer. Wäre so etwas denkbar oder sollte das TMemIniFile eigentlich verhindern? Gibt es eine Möglichkeit, solche Probleme grundsätzlich zu verhindern? Oder hat jemand andere Ideen, womit es zusammenhängen könnte?
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 8. Jan 2016, 17:38
Das hatte ich mit TMemIniFile auch einmal. Wenn du dir die Implementierung anschaust dann basiert das auf einer TStringList die erst einmal die gesamte Datei "leert" und dann noch einmal von vorne alles reinschreibt. Wenn dazwischen drin der Saft ausgeht dann hast du eine leere Datei.

Das Abmelden/Herunterfahren/Neustarten finde ich, im Standardfall, bei der VCL eine Katastrophe. Im Regelfall schießt Windows deine Anwendung knallhart ab sobald das Hauptformular zerstört wurde. Ich weiß nicht wie das mit den Dateipuffern ist- Vielleicht übernimmt er nur noch das "leermachen" der Datei, nicht mehr was dort hinein sollte?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 8. Jan 2016, 18:20
TMemIniFile schreibt nur in den WindowsFileCache, aber wann das auf der Platte landet, das entscheidet Windows.

Man kann natürlich die TMemIniFile auch so erweitern, daß sie (a) den Cache löscht und (b) notfalls auch noch ein Backup des alten Dateiinhaltes hält, so lange noch geschrieben wird.


Wie groß sind deine INI?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Jan 2016 um 18:25 Uhr)
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 8. Jan 2016, 22:12
Wie groß sind deine INI?
Unterschiedlich, je nach Verwendung. Sagen wir 10KB - 200KB. Spielt das eine große Rolle?

Man kann natürlich die TMemIniFile auch so erweitern, daß sie (a) den Cache löscht und (b) notfalls auch noch ein Backup des alten Dateiinhaltes hält, so lange noch geschrieben wird.
Ist das ein theoretischer Ansatz oder hast Du das schon irgendwo verwendet/gesehen? Wenn Du da Link oder Codeschnippsel für mich hättest, wäre das toll!
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 8. Jan 2016, 22:48
Grundsätzlich lösen kann man das, wenn man keine Ini-Datei verwendet.

Will man die Ini-Datei meiden aber mit TIniFile trotzdem arbeiten, dann schreibt man sich einen Ableitung und legt z.B. eine SQlite DB darunter.

Das ist weniger Arbeit als man vermuten mag.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 9. Jan 2016, 09:36
TMemIniFile beginnt bei ini.Free den Schreibvorgang (wo aller Inhalt auf ein Mal in die Datei geschrieben wird, also muss sie vermutlich auch erstmal geleert werden)..
Das ist nicht richtig. TMemIniFile schreibt lediglich bei UpdateFile.
Delphi-Quellcode:
procedure TMemIniFile.UpdateFile;
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    GetStrings(List);
    List.SaveToFile(FFileName);
  finally
    List.Free;
  end;
end;
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 9. Jan 2016, 14:44
TMemIniFile beginnt bei ini.Free den Schreibvorgang (wo aller Inhalt auf ein Mal in die Datei geschrieben wird, also muss sie vermutlich auch erstmal geleert werden)..
Das ist nicht richtig. TMemIniFile schreibt lediglich bei UpdateFile.
Delphi-Quellcode:
destructor TIniFile.Destroy;
begin
  UpdateFile; // flush changes to disk
  inherited Destroy;
end;
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#8

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 9. Jan 2016, 16:54
TMemIniFile beginnt bei ini.Free den Schreibvorgang (wo aller Inhalt auf ein Mal in die Datei geschrieben wird, also muss sie vermutlich auch erstmal geleert werden)..
Das ist nicht richtig. TMemIniFile schreibt lediglich bei UpdateFile.
Delphi-Quellcode:
destructor TIniFile.Destroy;
begin
  UpdateFile; // flush changes to disk
  inherited Destroy;
end;
Hmm..

Was hat das UpdateFile bei Destroy vom TIniFile mit dem Destroy vom TMemIniFile zu tun?

Eigendlich doch nichts...

Also, wenn ein TMemIniFile genutzt wird, muss der Programmierer selber dafür sorgen, das per UpdateFile die Daten 'rechtzeitig' gespeichert werden.
Somit spätestens, wenn eine CanCLose Message von Windows kommt...

Bei Verwendung eines TIniFiles wird das Update bei Destroy selber aufgerufen. Somit kann es hier zu dem Problem kommen, das die Ini-Daten bei einem HardKill nicht gespeichert werden..

Welche Anpassungen am TMemIniFile hat de TE denn gemacht?

Wie bereits geschrieben sollten das UpdateData immer nach einer 'wichtigen' Änderung erfolgen.

Besser ist es, die Konfigurationsparameter in einem eigenen Objekt zu puffern und nur zum Laden / Speichern direct auf die IniFiles zuzugreifen.

(Meine Meinung )
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 9. Jan 2016, 17:11
Ausgehend von den Delphi 7-Quellen zu TMemIniFile hat Holger recht:

Es wird nur gespeichert, wenn UpdateFile aufgerufen wird.

Im Destroy vom TMemFileIni (und auch in keiner anderen Routine) ist ein Speichern enthalten.

Daraus schließe ich jetzt mal ganz naiv:
Egal wie das Programm beendet wird, vor dem Beenden ist sicherzustellen, dass UpdateFile aufgerufen wird.

Ist dies sichergestellt und die Datei ist trotzdem leer oder gar nicht vorhanden, so liegt der Fehler ausserhalb des Programmes.

Dies könnte z. B. sein, wenn sie noch im Cache, aber noch nicht auf der Platte ist, der Rechner aber vorher schon aus ist, Rechner-/Windows-/Programmabsturz.

Nach Holgers Anregung stellt sich für mich jetzt die Frage: Wo wird bisher im Programm auf welchem Weg das Speichern durchgeführt.

Mit näherer Kenntnis dieses Vorganges könnten wir eventuell weiterführende Hilfestellung geben.
  Mit Zitat antworten Zitat
notAssertor
(Gast)

n/a Beiträge
 
#10

AW: Ini-Inhalt geht in sehr seltenen Fällen verloren (TMemIniFile)

  Alt 9. Jan 2016, 17:26
Und wie wäre es bei einem UpdateFile bei der CanClose-Abfrage?

Oh, ich sehe gerade die böse böse böse globale TMemIniFile, in der alles gespeichert wird...

Was ist denn mit dem ehrenwerten Sir Rufo los? Offline? Oder lässt er uns nur noch ein Weilchen spielen

@Sir Rufo: Grätsch' doch bitte ohne <Tgenericks> rein, damit es auch olle D7PE-Gruftis kapieren können Danke

@Alle: Ruft das Destroy des D7-TMemIniFile eigentlich immernoch das UpdateFile in neueren Delphis auf? Sollte man nicht dort zuerst mal nachschauen?

.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:31 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