Ini Write/Read zerstört nach und nach ini-File

  • Hallo.

    Ich verwende ein Windows-Programm an zwei Rechnern (nacheinander).

    Das Programm wird mit Autoit gestartet und prüft ob laut .ini der andere Rechner gerade aktiv ist.

    Hierzu gibt es ein "Free" oder die jeweilige WindowsUID in der .ini .

    Beim Schliessen wird das "Free" wieder geschrieben.

    In der .ini steht der Applikationspfad wie auch der Datenbankpfad zu den beiden PC-UIDs, damit das selbe Script auf beiden Rechnern genutzt werden kann.

    Nach dem Schliessen der Applikation wird beides auf mein NAS geschrieben.

    Beim nächsten Start wir die Datenbank auf den jeweiligen PC kopiert.

    Nun zu meinem Problem.

    Es wird immer nur folgende Section beschrieben:

    Code
    $RunningUserGUID = IniRead($IniFile,"Config","RunningGUID",0)

    Trotzdem werden nach und nach die dahinterliegenden Sections gelöscht, Zeichenkette für Zeichenkette.

    Ich kann die .ini im Notepad++ öffnen und nach einen Start/Beenden Zyclus fehlt am Ende der Datei plötzlich ein Teil der .ini .

    Code
    $AppPath = IniRead($IniFile,"AppPath",$MachineGUID,0)
    $DbPath = IniRead($IniFile,"DbPath",$MachineGUID,0)

    Es gibt aber im Programm nur IniReads auf diese Sections, nie ein Write.

    Weiß jemand ob es einen bekannten Bug in Sachen Ini-Handling gibt?

    Kann es evtl. an noch schlafenden Festplatten vom NAS liegen?

    Das Programm ist vor einem halben Jahr noch genau so wunderbar gelaufen.

    Was sich nun geändert hat weiß ich nicht.

    Evtl. hat ja jemand eine Idee wie so etwas passieren kann.

    Danke Euch erst einmal.

    Björn

  • Es ist etwas schwer von uns das Problem nachzuvollziehen.
    Ein Minimalskript, welches das Problem reproduziert gibt es nicht und aufgrund der Konstellation mit dem NAS wird es das evtl. auch nicht so einfach geben.


    Beim Lesen sind mir jedoch ein paar Verständnisfragen gekommen:

    1. Du schreibst: Es gibt aber im Programm nur IniReads auf diese Sections, nie ein Write.. Oben jedoch schreibst, du dass die Skripte entweder ein Free oder die GUID schreiben. Also doch ein Write?
    2. Ist die "Datenbank" von der du schreibst die ini-Datei oder etwas anderes?
    3. Wie ist die ini-Datei aufgebaut - ein Beispiel wäre hilfreich.
    4. Kopierst du die ini vom NAS erst auf den Rechner und schiebst sie danach wieder hoch - wenn ja: Wie genau mit welchen Befehlen? - oder machst du die Inibefehle direkt auf die Freigabe auf dem NAS?
    5. Kann es zu race-conditions kommen - sprich: Wäre es möglich, dass zwei Skripte ungefähr zur gleichen Zeit auf die Datei gleichzeitig zugreifen?
    6. Ein durchnummerierter Ablauf was Skript 1 auf Rechner 1 macht und was dann passiert wäre hilfreich um die tatsächlichen Abläufe auch für uns besser nachvollziehbar zu machen.
  • Ich kann AspirinJunkie nur zustimmen. Darüberhinaus wie folgt:

    Ich verstehe Deinen Post in Sachen Rw so dass du in die Ini schreibst aber nicht in die Sektion wo die Daten verschwinden.

    Ich selbst verwende *.inis zu hauf. Jedes meiner Scripte hat auch eine ini. Ich kann mich nicht erinnern diesen Fehler schon mal gehabt zu haben.

    Als Editor verwende ich auch Notepad++

    Ich habe inis mit einigen 100 Einträgen (da missbrauche ich die *ini für mail Adressen, die ich bei Programmstart in ein Array einlese.) Die Daten ändern / erweitern sich ständig. Hier wird also z.B. mit Notepadd++ eine ini geöffnet und Einträge hinzugefügt. Die Programme dazu sind aber z.Z. der händischen Datenänderung Nicht gestartet.

    Als Prüfmöglichkeit hätte ich folgende Idee. Spalte deine Daten in 2 inis auf.

    1te ini nur Daten die immer neu geschrieben werden

    2te ini die Daten die immer "unverändelich" (im Sinne nicht durch den Source änderbar) sind. Das macht kaum arbeit - und durch die Folgen oder Nichtfolgen lassen sich die Spuren leichter nachvollziehen.

    Damit lässt sich schon mal einschränken wer NICHt für den Datenschwund zuständig ist.

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hier noch ein "Ini" aufruf aus einem Source der seit Jahren so läuft OHNE die Ini zu "schrumpfen"

    -------------------------------

    Const $programm_name = 'test'

    Const $ini_pfad = $start_dir &'\' & $programm_name & '.ini'

    Global $warten = iniRead ($ini_pfad, "10", "warten", "default")

    ;MsgBox (0, "Warten?", $warten)

    IF $warten ='n' Then .....


    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Tueftler,

    ich verwende ebenfalls ini in vielen Fällen und habe dieses Verhalten auch noch nirgendwo beobachten können.

    Tipp: Schreib dir mal ein Miniprogramm, das nur das (oder die) ini read(s) ausführt.

    Wenn das Verhalten dort nicht zu beobachten ist, ist der Grund in deinem restlichen Programmcode oder wie oben bereits erwähnt (und auch von mir so verstanden) doch ein Schreiben in ide Ini, das dieses Problem auslöst.

  • Hallo Tueftler,

    ich glaube ich habe da was für dich, habe ich selbst erst heute geschrieben deswegen bitte verzeihe wenn es nicht so ordentlich aussieht.
    Ich wollte für mich eigentlich eine Funktion schreiben mit der ich auch in ini form Dateien auslesen kann auch wenn sie verschlüsselt sind.

    Die Option einfach setzten musst aber kein Kennwort oder sowas setzten es geht auch mit normalen Dateien egal welche Endung Hauptsache Ini Inhalt.

    _iniCyp($file = '', $iAlgID = '', $key = '', $opt = '', $katopt = -1)

    $file pfad zum file

    $iAlgID = $CALG_AES_256 ; einfach den Wert setzen oder einen andere Verschlüsslung egal es geht hier nur um die Abfrage in der Funktion,

    $key = falls du eine Datei verschlüsselt hast dann gib hier den Schlüssel ein falls nicht einfach auf '' lassen

    $opt = sind die Optionen was die Ausgeben werden lassen soll

    1 : die sectionen ohne [] zeichen

    2: alle werte in der ini vor dem =

    3: alle werte in der ini nach dem =

    4: alle werte in der ini ohne sectionen getrennt array[][]

    5. alle werte+$katopt sectionen=katopt (zahl) dann wird die ganze Sektion angezeigt aber nicht durch = getrennt

    6. wie in 5 alle werte aber getrennt je nach katopt wert.

    Achte darauf das in deiner datei (ini) keine leerstellen sind zwischen den werten.

    hier ein Beispiel ich hoffe die hilft das ^^:

    @EDIT : ich muss mich korrigieren habe nun einige ini Dateien ausprobiert manche gehen ohne Problem andere mag er nicht

    wenn ich allerdings dann den Inhalt in eine *txt Datei schreibe funktioniert der code. + ich vermute es liegt das in manchen ini Dateien am Ende 2-3 @Crlfs drinnen sind, die in der kopierten txt nicht sind da ich die nicht mit kopiere.

    Habe gerade etwas hinzugefügt

    Code
    equal_($arrays, $string)

    Damit kannst du wie bei Iniread den string davor oder dahinter abfragen.

    Es wird dir ein array zurück geben falls der wert öffter vor kommt damit du das dann gleich trennen kannst.

    Als tipp :

    Code
    $arrays = _iniCyp($file, $CALG_AES_256, '', 5, 1)

    Lass dir dein Array mit der Funktion erstellen den letzten Parameter so einstellen das er nur diese Sektion durchsucht die du auch anwählen willst und dann bei equal_ das array eintragen, das grad erstellt wurde, danach den string dann

    wird nur die eine Sektion nach dem String gesucht und nicht in der ganzen ini durchsucht.


    beispiel ini :

    5 Mal editiert, zuletzt von MojoeB (28. Oktober 2022 um 00:16) aus folgendem Grund: beispiel geändert und kommentar hinzugefügt. funktion hinzugefügt

  • MojoeB : Ich verstehe nicht ganz was deine Ini-Tüftelei mit dem Problem von Tueftler zu tun haben soll bzw. wie ihm das helfen sollte.

    Mal ganz abgesehen davon, dass ich den Sinn hinter deinem Code nicht verstehe, da z.B. Sektionen nun mal dafür da sind um zu trennen. Und sonst ließt man halt per https://www.autoitscript.com/autoit3/docs/f…ectionNames.htm erst die Sektionsnamen aus und danach per https://www.autoitscript.com/autoit3/docs/f…ReadSection.htm deren Inhalte (was du dann damit machst bleibt ja jedem selbst überlassen).

    Der Code sieht für mich danach aus, als würdest du die vorhandenen Funktionen nicht kennen.

  • Moombas :nun ja wenn er damit Probleme hat wollte ich ihm nur eine zweite Möglichkeit aufzeigen an der ich zufällig gestern dran gearbeitet habe.
    Außerdem bitte korrigiere mich wenn ich falsch liege zumindestens ich habe es nicht hinbekommen den ini inhalt in verschlüsselten dateien mit Iniread auszulesen.

  • Ich muss gestehen, bei genauerer Betrachtung einen Denkfehler zu haben (nur Bezug auf Dateien, nicht auf reinen Text).

    Und aus Sicherheitsaspekten wäre wohl ein _TempFile() ein nogo.

  • Also wenn man den Beitrag von Moombas heranzieht kennt er den vom TE beschriebenen Fehler auch nicht --> dann scheint der Fehler tatsächlich nicht bei Autoit zu liegen sondern im Umfeld des Programmes.

    Nach *.ini write Befehlen ev. ein (Angst) Wait einbauen damit der Source nicht weiterläuft ohne dass der write Befehl auch wirklich abgeschlossen ist. (Bitte nicht schlagen wenn das in dem Iniwrite Befehl implementiert ist - das habe ich noch nie Nachgesehen).

    Wenn die inis via NAS "verteilt" werden mach doch mal eine Sicherheitskopie die nicht über das NAS läuft. Und vergleiche nach sinnvoller Zeit/schreibintervallen

    Fehlt in der *.ini ev. ein Sections Befehl?

    Gib uns doch mal Nachricht was Du schon alles ausprobiert hast?

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ach herrjeh - Hier haben ja einige etwas zu meinem Problem geschrieben.

    Ich habe leider keine Email-Benachrichtigung erhalten, dass Antworten kamen :(

    Vielen Dank Euch hierfür!

    Ich werde mich nun schnell mal hin setzen und mit Euren Tipps versuchen das weiter einzugrenzen.

    Sorry für die verspätete Rückmail - Ich muss mal schauen woran das nun lag.

    Melde mich,

    Björn