Gemischte Ini-Datei updaten - Ideen gesucht

  • Ach bitte, wozu soll das den gut sein? Ist der Sinn nicht klar?

    Weil du Hilfe willst.
    Und ich persönlich habe keinen Bock wenn ich dir schon eine Lösung schreibe noch erst umständlich mir Testeingabedaten und Check-Daten selbst zu basteln.

    Es gilt immer die Grundregel "Warum sollte sich jemand mehr Mühe für die Lösung deiner Frage machen als du selbst in die Fragestellung gesteckt hast?".

    und jetzt gib mir mal nen Moment...

  • So - mal schnell dahingerotzt:

    4 Mal editiert, zuletzt von AspirinJunkie (24. April 2021 um 08:37)

  • In "C:\Program Files\Open-Shell\" habe ich eine Ini gefunden mit fast 300 KB. Das 32 KB Limit scheint nicht mehr zu existieren.

    Am Rande :

    Ich habe mal zum Spaß eine .ini-Datei mit 40.000 Zeilen (enthält 20.000 Sektionen) generiert - Filesize 700 KB. Die Änderung eines Values in z.B. [Sektion19990] ist problemlos möglich. Das 32 KB Limit scheint, zumindest ab Win7, also nicht mehr zu gelten.

    Trotzdem würde auch ich die Verwendung eines anderen Formates vorziehen (siehe Beispiele von BugFix , AspirinJunkie und anderen).

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hast du die Ist.ini gespeichert bzw. ist es die richtige?

    Es ist nicht die gepostete, weil das Kopieren aus der Webseite die Formatierung ändert. Ich habe eine neue Ist.ini erstellt, das ging schneller. Im Anhang sine alle 3 Dateien, inklusive der Ergebnis.ini , die dein Code erzeugt hat.

  • Das 32 KB Limit scheint, zumindest ab Win7, also nicht mehr zu gelten.

    Dann wird sich das 32 KB Limit nur auf IniReadSection() beziehen. Und das wäre ja wirklich kein Problem. Wenn man davon ausgeht, dass die PSPad.ini bei 32 KB Gesamtgröße aus insgesammt etwa 1.500 Zeilen besteht und man das für eine einzelne Sektion benutzen könnte, ... ich kann da kein Problem sehen, die ganze PSPad.ini würde in 1 Sektion passen. Und man kann doch locker mehr Sektionen erstellen, usw.

    Danke fürs Testen!

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Super Arbeit! :thumbup:

    Lediglich bei asiatischen, arabischen, bulgarischen, ... Zeichen macht der Code nicht mit. Woran es lag, konnte ich nicht rausfinden, ich habe eine Ini mit Sprachen geladen und die Ausführung blieb gleich stecken.

    Aber das ist nicht schlimm, ich habe nicht vor, Language.ini's auf diese Art upzudaten. Im Moment sind nur Settings beabsichtigt, das reicht.

    Vielen Dank für deine Mühe! :) ... Jetzt muss ich nur noch sehen, wie ich das auf VBScript umsetzen kann. :D

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Falls dir langweilig ist und du eine Ini mit Zeichen in allen möglichen Sprachen angehen willst, sind im Anhang Beispieldateien. Wegen der Größe der Datei habe ich die Ausgabe in eine Datei gespeichert (in der 2.au3, Zeile 4: FileWrite("Ergebnis.ini", $sZusammen)).

    In der Ist.ini gibt es 4 Änderungen zur Soll.ini. Falls du WinMerge oder ähnliches hast, kannst du sie dir leicht anzeigen lassen. Ansonsten kannst du nach "Hallo Welt!" suchen, das ich an den 4 Stellen eingefügt habe.

    Edit: AspirinJunkie Bitte nur als Zusatzarbeit verstehen, es wird im konkreten Fall nicht wirklich benötigt (siehe vorheriges Posting).

  • Dann wird sich das 32 KB Limit nur auf IniReadSection() beziehen.

    So sieht es wohl aus.

    Dazu eine .ini-Datei, die eine [Sektion] mit 20.000 Key/Value Paaren enthält, generiert (Datei=390 KB) :

    ==> das von IniReadSection zurückgegebene Array liefert nur die ersten 32 KB

    --> mit z.B. IniRead($IniPath, 'Sektion', 'Key19990','') erhalte ich aber auch alle Werte > 32 KB

    Egal, solche Dimensionen spielen in deinem Projekt ja eh keine Rolle ;).

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hier noch zwei Anmerkungen zu Ini:

    IniEx.au3 (INI File Processing Functions) solve many problems, such as the limits of AutoIt Default INI function, and add many other options, since all function work by reference so IniEx.au3 also use less memory, and provide a really good performance in speed

    Total Commander macht es mit den Sektionen z.B. so:

    Code: wincmd.ini
    [Colors]
    RedirectSection=%COMMANDER_PATH%\MULTI\Config\Color\Color.ini
  • BugFix Danke für den Tipp, ein Konzept mit Global- und User-Properties zu nutzen! Im Moment ist mir das noch zu fremd, aber ich werde mich damit beschäftigen, um damit vertrauter zu werden.

    Musashi Danke fürs Limit austesten!

    Bitnugger Danke für den "RedirectSection"-Tipp!

    Mit all diesen Tipps ist der Himmel das Limit! :saint:


    AspirinJunkie Gut gemacht! :thumbup:

    Das hat nichts mit den Zeichen zu tun sondern lediglich mit dem Umstand, dass Inhalte noch vor der ersten Section stehen.

    Gut dass du das entdeckt und gelöst hast! Inhalte (Kommentare) vor der ersten Section sind in meinem Fall sehr wichtig, wegen dem "gemischten Inhalt". Wie ich eingangs schrieb, geht es um das Updaten der Ini. Deshalb wird in der ersten Zeile ein Kommentar mit einer Versionsangabe stehen.

    Deinen neuen Code (Version 3) habe ich getestet, er hat wunderbar funktioniert!

    Die Test-Dateien im Posting #31 haben noch einen unerwarteten Zusatz-Test gebracht, denn sie sind in einem Unix-Format gespeichert. Dein Code hat auch das mit Bravour gemeistert!

    Also ist es nicht das gewünschte Resultat.
    Bitte also noch eine dazugehörige Beispieldatei.

    Entschuldige meinen Unmut deswegen, ich dachte, du wolltest mich veralbern.

    Als ich den Thread erstellt habe, ging ich von einer Diskussion über verschiedene Methoden und dem Austausch von (theoretischen) Ideen aus. Dass jemand gleich mit einer Lösung aufwartet und den Code erstellt, hatte ich nicht auf dem Schirm. - Beim nächsten Mal bekommst du von mir soviele Beispieldateien, wie du willst. (Solange es nicht mehr als 4 sind.) 8o

    Summa summarum kann ich sagen, dass ich positiv überrascht bin und nicht damit gerechnet hatte. Vielen Dank für deine Mühe! :thumbup:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • AspirinJunkie

    Kannst du bitte eine Erkennung hinzufügen, ob die Soll.ini und die Ist.ini unterschiedlich sind? (Bei meinem RegEx-isch würde ich Jahre dafür brauchen.) Damit soll dann die Ergebnis.ini nur geschrieben werden, wenn es eine (1 oder mehr) Änderung gebeben hat. Die Rückgabe kann z.B. in einem zusätzlichen Parameter erfolgen.

    Pseudo-Code zur Veranschaulichung, was gemeint ist.

    AutoIt
    Local $bDiffsFound
    
    $sZusammen = _IniCombine("Soll.ini", "Ist.ini", $bDiffsFound)
    ; ConsoleWrite($sZusammen & @CRLF)
    If $bDiffsFound Then FileWrite("Ergebnis.ini", $sZusammen)
    
    Func _IniCombine(Const $sSourcePath, Const $sAddPath, ByRef $_bDiffsFound)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    2 Mal editiert, zuletzt von Professor Bernd (24. April 2021 um 04:57)

  • Kannst du bitte eine Erkennung hinzufügen, ob die Soll.ini und die Ist.ini unterschiedlich sind? (Bei meinem RegEx-isch würde ich Jahre dafür brauchen.)

    Solange es nur grundsätzlich darum geht, ob sich die Soll.ini und die Ist.ini unterscheiden (nicht wo), wäre dann ein Vergleich z.B. der MD5-Hashes nicht ausreichend ?

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Solange es nur grundsätzlich darum geht, ob sich die Soll.ini und die Ist.ini unterscheiden (nicht wo), wäre dann ein Vergleich z.B. der MD5-Hashes nicht ausreichend ?

    Eine solche Möglichkeit würde ich vorziehen. Ich habe mir Aspirinjunkies Code gerade nochmal angesehen und glaube, eine Änderungserkennung ist da recht schwierig einzubauen.

    Leider ist eine Überprüfung nicht zielführend, bei der lediglich festgestellt wird, ob die Soll.ini und die Ist.ini unterschiedlich sind. Denn beide Dateien dürfen grundsätzlich unterschiedlich sein: In der Soll.ini (quasi Global.properties) stehen die Standard-Werte und in der Ist.ini (User...) stehen die Werte, die dem User gefallen.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Wie wäre es mit folgender Idee?

    Solange es nur grundsätzlich darum geht, ob sich die Soll.ini und die Ist.ini unterscheiden

    Nicht die Soll.ini und die Ist.Ini vergleichen, sondern die Ist.ini und die Ergebnis.ini. Könnte das funktionieren? Falls ja, wie gehts am schnellsten: Zeilenweise vergleichen (Dateien befinden sich ja schon im RAM), oder gibts dafür auch eine RegExe, die mit 32+ KB zurechtkommt?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.