Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was passiert mit der INI-File beim beschreiben ? (https://www.delphipraxis.net/40954-passiert-mit-der-ini-file-beim-beschreiben.html)

Darty 23. Feb 2005 19:10


Was passiert mit der INI-File beim beschreiben ?
 
Hi Leutz,

was mich interessieren würde ist, wenn ich einige Daten in die Ini schreibe wird die Komplette Datei beschrieben so das die alten Einträge gelöscht sind ? Oder werden nur die beschriebene Werten neu angelegt ?

Mir fiel es nur auf, weil ich in einer IniFile z.B. folgendes stehen habe
Code:
[Data]
Anzahl=2
[Data1]
Titel=Irgendwas
[Data2]
Titel=Nochirgendwas
Nehmen wir an, das ich im Programm jetzt Data2 gelöscht habe. Wegen den Anzahl=1 wird er dann nur einmal den Wert einlesen daher fiel es mir nicht sofort auf. Aber er lässt trotzdem Data2 drin stehen. Weil ich davon ausging das es komplett überschrieben wird.

Danke schon mal für euer Erklärung und eventuell falls es so ist wie ich es vermute wie ich es lösen könnte ? Oder wäre die einzigste Möglichkeit vor dem speichern die Datei zu löschen ?

arbu man 23. Feb 2005 19:11

Re: Was passiert mit der INI-File beim beschreiben ?
 
Nein, ältere Daten werden ich gelöscht

Darty 23. Feb 2005 19:30

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von arbu man
Nein, ältere Daten werden ich gelöscht

Ich nehme mal an statt ich heisst es nicht oder ? Und was gibt da für eine Lösung ? Die Radikal Methode bevor geschrieben wird die Datei löschen ?

Hansa 23. Feb 2005 20:19

Re: Was passiert mit der INI-File beim beschreiben ?
 
Ich weiß es zwar nicht genau, gehe aber zu 98 % von folgendem aus : da es sich um Textdateien handelt werden diese wohl nur sequentiell gelesen/geschrieben werden können. Ich bearbeite meine Source-Codes z.B. folgendermaßen (hauptsächlich wegen $DEFINE) :

1. Datei kopieren.
2. zeilenweise aus Kopie lesen, ändern und in neue Datei schreiben.

falls fehlerfrei :

4. Original mit geänderter Datei überschreiben
5. Kopie löschen

Glaube kaum, daß Mickysoft es anders macht. 8)

Binärbaum 23. Feb 2005 20:32

Re: Was passiert mit der INI-File beim beschreiben ?
 
Also es ist so, dass alte Einträge in einer Ini nicht gelöscht werden. Nur wenn man einen Wert ändert, dann werden alte Werte überschrieben. Oder es werden halt neue Werte hinzugefügt, wenn der Wert noch nicht existiert.
Wenn man alle alten Daten löschen will, ist wohl die "Radikalmethode" am angebrachtesten: Datei löschen und dann mit den nötigen Werten neu schreiben.

MfG
Binärbaum

SirThornberry 23. Feb 2005 20:33

Re: Was passiert mit der INI-File beim beschreiben ?
 
ich lese bei programmstart alles aus der ini aus und beim beeenden wird die Ini-Datei gelöscht und komplette neu geschrieben.

Hansa 23. Feb 2005 20:45

Re: Was passiert mit der INI-File beim beschreiben ?
 
Es sieht so aus, daß weder was gelöscht wird usw. Das wird aber sehr wohl alles gelöscht und eben umkopiert. Rest : siehe vorheriger Beitrag. Man vergleiche mal eine .PAS die man geändert hat, mit einer gleichnamigen .~PAS 8)

roderich 23. Feb 2005 20:47

Re: Was passiert mit der INI-File beim beschreiben ?
 
Natürlich werden "alte Einträge" in Ini-Dateien gelöscht (was auch immer das bedeuten soll, ich vermute mal Einträge, die mit DeleteKey gelöscht wurden). Wäre ja auch schlimm wenn nicht.....

Die Section bleibt aber solange drin, bis auch sie mit EraseSection gelöscht wird. Der Sinn ist vermutlich der, daß beim Löschen des letzten Eintrags aus einer Section die dann leere Section an der Stelle bestehen bleiben soll. Ansonsten würde sie beim ersten Wieder-Anlegen eines Eintrags ganz unten angelegt, was vielleicht verwirrend sein könnte.


Roderich

roderich 23. Feb 2005 20:49

Re: Was passiert mit der INI-File beim beschreiben ?
 
@Hansa:

eine Inidatei hat mit einer .pas-Datei aber nun wirklich gar nix zu tun..... :???:

Roderich

arbu man 23. Feb 2005 20:55

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von Darty
Zitat:

Zitat von arbu man
Nein, ältere Daten werden ich gelöscht

Ich nehme mal an statt ich heisst es nicht oder ? Und was gibt da für eine Lösung ? Die Radikal Methode bevor geschrieben wird die Datei löschen ?

ja ich meinte nicht

Hansa 23. Feb 2005 21:34

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von roderich
@Hansa:

eine Inidatei hat mit einer .pas-Datei aber nun wirklich gar nix zu tun..... :???:

Von wegen. Das ist ja das Problem ! Es ist genau dasselbe. Nichts anderes als eine stinknormale Textdatei. Ob die .TXT .INI .PAS oder .ROD heißt ist egal. :!:

roderich 23. Feb 2005 22:53

Re: Was passiert mit der INI-File beim beschreiben ?
 
@Hansa:

No :warn:

Eine Inidatei ist nicht eine stinknormale Textdatei. Eine Inidatei ist nach einem festen Schema aufgebaut, und zwar in Sections (oder Gruppen) organisiert, deren Namen in eckigen Klammern eingefaßt sind. Innerhalb dieser Sections stehen Einträge im Format <Identifier> = <Value>. Der Zugriff erfolgt mit den Methoden von TIniFile, wobei Einträge nur mit Angabe des Sections-Namen manipuliert werden können.

Z.B.

Delphi-Quellcode:
  Inifile.WriteString(Section, Identifier, Value);

Die Datei-Extension ist allerdings wurscht, da stimm ich dir zu. Es hat sich aber .ini etabliert.


Roderich

Hansa 24. Feb 2005 00:30

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von roderich
@Hansa:

No :warn:

Nene, nix Warn ! Das ist und bleibt eine Textdatei. Ob die jetzt *.ROD heißt, oder mehrere []]}}{] usw. enthält, vielleicht auch nur ääääääää s oder xyz ist völlig egal.

jim_raynor 24. Feb 2005 07:11

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von roderich
@Hansa:

No :warn:

Nene, nix Warn ! Das ist und bleibt eine Textdatei. Ob die jetzt *.ROD heißt, oder mehrere []]}}{] usw. enthält, vielleicht auch nur ääääääää s oder xyz ist völlig egal.

Ich frage mich gerade, was das mit dem Thema zu tuen hat. Technisch gesehen sind alles, Binär-Dateien. Und Technisch ist es nicht möglich ein Byte physikalisch aus einer Datei so zu löschen, dass die anderen nachrücken. Sollen Daten gelöscht werden, muss die Datei komplett neu geschrieben werden. Aber das hat überhaupt nichts mit dem Thema zu tuen.

Diese *.~Pas dateien sind einfach nur Backupfiles die von Delphi angelegt werden.

phXql 24. Feb 2005 07:36

Re: Was passiert mit der INI-File beim beschreiben ?
 
INI-Files werden nicht gelöscht und neu geschrieben. Wers nich glauben will, darfs gerne ausprobieren. Wenn man vorher 2 sections hatte, diese läd, und dann im Inifile mit writesection nur eine am ende wieder schreibt, is die 2te trotzdem noch drin. Deswegen das INI vor dem beschreiben mit DeleteFile() löschen.

Darty 24. Feb 2005 10:27

Re: Was passiert mit der INI-File beim beschreiben ?
 
Danke Leute, nun habe ich Gewissheit weil es mich zunächst verwirrt hatte als ich es in ein Text Editor angeschaut habe. Also werde ich wohl die Ini löschen bevor ich es neu schreibe.
Oder wenn man auf der sichere Seite will das die Speicherfunktion unterbrochen wird sollte man doch lieber die Ini zunächst Temporär speichern, dieses dann die Ini überschreiben und dann die Temporäre Datei wieder löschen.

Übrigens INI ist zwar anders eingeteilt mit Section u.s.w. aber so oder so sie ist trotzdem eine Text Datei. Man könnte auch eine BlaBla.XYZ als Ini File benutzen anstatt BlaBla.Ini .

roderich 24. Feb 2005 11:37

Re: Was passiert mit der INI-File beim beschreiben ?
 
also, um das ganze leidige Thema mal abzuschließen.....

Inidateien sind (natürlich) Textdateien, genau wie *.pas, *.c, *.bat, ... und 1000 andere -> sie sind also z.B. mit einem Texteditor lesbar.
Sie sind aber nach ihrer Definition nicht "ganz normale" Textdateien, sondern in einem festen Format aufgebaut. Dieses Format sieht Gruppen (Sections) vor, innerhalb derer die Einträge (Identifier) stehen. Gruppen sind in eckigen Klammern [] eingefaßt. Einträge werden immer von einem "=" Zeichen gefolgt, nach dem der Wert (Value) steht.


Beispiel:

[System]
GUI=1
Bootlogo=Splash.bmp

[Printer]
Default=HP Deskjet


So, falls jetzt mit Inifile.WriteString('Printer', 'Default', 'Epson Stylus') der Default-Eintrag in der Printer-Gruppe geändert wird, bleibt NATÜRLICH auch die erste Gruppe "System" bestehen. Wär ja auch schlimm, wenn nicht.
Wenn mit Inifile.DeleteKey('Printer', Default') der Default-Eintrag gelöscht wird, bleibt die Gruppe "Printer" trotzdem bestehen, nur eben leer (d.h. ohne Einträge).

Eine Inidatei löschen zu müssen, bevor sie neu geschrieben wird, deutet zumindest mal auf ein "seltsames" Programmkonzept hin. Oder Inidateien werden dort nicht in ihrem eigentlichen Sinn verwendet.

Die Delphi-Hilfe zu TIniFile erklärt das Konzept übrigens auch recht gut.


Roderich

IngoD7 24. Feb 2005 11:43

Re: Was passiert mit der INI-File beim beschreiben ?
 
//EDIT: Dieses Posting hat sich mit dem von roderich zuvor überschnitten.
--------------------------------------------------------------------------

Oh man, ihr habt aber auch alles in den Thread reingeschmissen, was es zum Thema Datei gibt, wie? :shock:

Zitat:

Zitat von Darty
Also werde ich wohl die Ini löschen bevor ich es neu schreibe.

Wieso das denn? :roll:

Wenn du eine Ini als das benutzt, wofür sie da ist, was gibt es dann für Probleme? Wenn du eine Ini bearbeiten wilst, dann tue das über TIniFile. Damit stehen dir genügend Methoden zur Verfügung, die Bestandteile einer Ini (Sektionen, Schlüssel und Werte) zu lesen, zu schreiben oder zu löschen.

Diese Bestandteile einer Ini sind separat zu betrachten und zu bearbeiten. Dabei ist es völlig egal, in welchem Fileformat eine Ini auf die Platte geschrieben wird. Und ja, das Fileformat ist Textfile.
Es ist ein Textfile mit vorgegebener inhaltlicher Struktur (Sektionen, Schlüssel, Werte). Eben der Struktur einer gemeinhin als Ini bezeichneten Datei.

Wenn du die Sektion A bearbeitest, bleibt Sektion B natürlich unberührt. Das ist doch gerade der Witz an TIniFile, dass du die Bestandteile einer Ini separat bearbeiten kannst und nicht die ganze Datei lesen, bearbeiten und zurückschreiben musst.

Änderungen (schreiben, löschen) sind bei NT (und in der Familie aufwärts) sofort in die Ini-Datei auf der Platte eingepflegt. Bei Windows95 (und spätere Verwandte) wird der Plattenzugriff möglicherweise noch gepuffert. Da kann man dann aber das Schreiben auf Platte mit TIniFile.UpdateFile erzwingen.

Darty 24. Feb 2005 11:51

Re: Was passiert mit der INI-File beim beschreiben ?
 
Damit keine Missverständnisse gibt.

Ich verwende die Ini Datei (eine einzige Datei) um die Einstellungen u.s.w. im Programm zu speichern. Klar die braucht man dann nicht zu löschen u.s.w. ABER ich verwende diese Datei auch um die Daten aus einer ListView zu speichern (darüber kann man streiten da andere Möglichkeiten gibt). Und gerade wenn ich die Daten speicehre wird es in Section Data1 Data2 u.s.w. erstellt. Sobald ich aber mal 100 Data gespeichert habe. Und irgendwann dann die 50 Datas lösche dann stehen die "alten" 50 Datas immer noch drin. Also wird die Datei nur unötig aufgebläht obwohl nicht mehr benötigt wird. Deswegen das löschen.

IngoD7 24. Feb 2005 12:08

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von Darty
ABER ich verwende diese Datei auch um die Daten aus einer ListView zu speichern (darüber kann man streiten da andere Möglichkeiten gibt)

Wenn es denn so sein soll ...

Zitat:

Zitat von Darty
Sobald ich aber mal 100 Data gespeichert habe. Und irgendwann dann die 50 Datas lösche dann stehen die "alten" 50 Datas immer noch drin.

Wovon ist denn abhängig, ob du 50, 20, 76 oder alle 100 löscht? Lösche doch einfach immer dann ein Data raus, sobald du es nicht mehr brauchst.

roderich 24. Feb 2005 12:14

Re: Was passiert mit der INI-File beim beschreiben ?
 
@IngoD7:
Du hast es (auch) erfaßt :???:

@Darty:
du verwendest Inidateien in einem anderen Sinn, als sie eigentlich vorgesehen sind. Selbst das würde aber noch gehen, wenn du einfach die Daten in einer einzigen Gruppe speicherst (z.B. 1=Eintrag1, 2=Eintrag2 usw.). Dann kannst Du mit EraseSection die eine Gruppe löschen und dann nur mit den zu speichernden Daten füllen.


Roderich

Darty 24. Feb 2005 12:47

Re: Was passiert mit der INI-File beim beschreiben ?
 
hmmm ...

Dann muss ich wohl noch ein wenig an der Code basteln.
In Moment schreibe ich mithilfe einer Schleife die Daten rein. Und der Wert Count von der Listview wird mitgespeichert
so das ich auch wieder mit einer Schleife auslesen kann. Da man ja den Wert nicht im Vorraus weisst.
Also muss ich den alten Count Wert und den neuen Wert wissen, damit ich die restlichen alten die nicht mehr benötigt werden seperat lösche. Auch eine gute Idee.

Bei mir sieht die Section mit den Daten von Listview so ungefähr aus
Delphi-Quellcode:
[Data1]
Titel=BlaBla
Kategorie=glucl gluck
[Data2]
Titel=sdfsdf
Kategorie=sdfsdf
...
...
sind bei mir aber noch mehrere Keys drin, sollte ja nur ein Beispiel sein damit man es sich vorstellen kann das mit einer einzige Section löschen nicht getan ist.

roderich 24. Feb 2005 13:26

Re: Was passiert mit der INI-File beim beschreiben ?
 
lösch die alten Gruppen doch einfach

Delphi-Quellcode:
for i := NewCount+1 to OldCount do
  IniFile.EraseSection('Data' + IntToStr(i));

Darty 24. Feb 2005 18:06

Re: Was passiert mit der INI-File beim beschreiben ?
 
Zitat:

Zitat von roderich
lösch die alten Gruppen doch einfach

Delphi-Quellcode:
for i := NewCount+1 to OldCount do
  IniFile.EraseSection('Data' + IntToStr(i));

Ja das meinte ich doch :roll:


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:08 Uhr.

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