Es geht darum, eine Ini-Datei zu aktualisieren, ohne deren Einstellungen zu verlieren.
In Pau3 gibt es eine Main-Ini, mit der Einstellungen verwaltet werden. Wenn nun ein User ein Update über seine vorhandene Version kopiert, will er seine Einstellungen natürlich nicht verlieren. In einer reinen Ini wäre das recht einfach, indem man nur die Werte auf Vorhandensein und Gültigkeit prüfen und ergänzen würde.
Zum einen handelt es sich hierbei aber um eine Ini mit gemischtem Inhalt, nämlich mit Kommentaren, die Infos zu Einstellungen geben. Z.B. zum Schlüssel FarbSchema könnte es einen Kommentar FarbSchema: hell, dunkel, auto geben.
- Edit: Nach Info von AspirinJunkie sollten Kommentare keine Probleme machen.
Zum anderen soll eine vorgesehene Reihenfolge in der Ini eingehalten werden.
Es gibt also eine "Soll"-Ini und eine "Ist"-Ini.
"Soll"-Ini (Script) | "Ist"-Ini (User) |
---|---|
Befindet sich als Code im Script. | Befindet sich als Datei auf der Festplatte. |
Enthält alle Schlüssel und Kommentare in der gewünschten Reihenfolge und mit der gewünschten Formatierung (z.B. nur 1 Leerzeile vor einer weiteren Sektion, usw.). | Enthält evtl. nicht alle Schlüssel, Kommentare sind vorhanden oder gelöscht, die Reihenfolge ist evtl. komplett durcheinander, die Formatierung ist Kraut und Rüben. |
Schlüssel enthalten die Standard-Werte. | Schlüssel enthalten vom User eingefügte Werte, enthalten falsche oder keine Werte. |
Nun sollen die Werte der Schlüssel in der Ist-Ini aktualisiert werden, wobei vorhandene gültige Werte des Users erhalten bleiben. Neue Schlüssel und Kommentare sollen hinzugefügt, gelösche Kommentare und die gewünschte Reihenfolge wieder hergestellt werden. Ich denke, es ist klar wie's gemeint ist.
Der Code wird beim Starten von PSPad geladen und sollte leicht geschwindigkeitsoptimiert sein, das heißt, es kommt zwar nicht auf Millisekunden an, aber wenn der Code flott ist, ist das gut für die Startgeschwindigkeit von PSPad.
Meine Überlegung schwankt zwischen Arrays und Dictionarys. Auf jeden Fall könnte ich es mir so vorstellen, dass z.B. beide Inis zeilenweise (StringSplit()) in Arrays geladen und verglichen werden.
- Das Soll-Array wird von Anfang bis Ende durchlaufen und jede einzelne Zeile mit allen Zeilen des Ist-Arrays verglichen.
- Handelt es sich bei der Soll-Zeile um einen Kommentar, wird er übersprungen, denn die Kommentare werden am Schluss bei Schreiben an die richtige Stelle gesetzt.
- Handelt es sich bei der Soll-Zeile um einen Schlüssel, werden alle Zeilen des Ist-Arrays durchlaufen, bis der Schlüssel gefunden ist. Ist der Schlüssel im Ist-Array NICHT vorhanden, wird die Soll-Zeile einfach übernommen. Ist der Schlüssel im Ist-Array vorhanden, wird der Wert auf Gültigkeit geprüft und entweder übernommen (wenn gültig) oder ersetzt (wenn UNgültig).
- Evtl. als Geschwindigkeitsoptimierung die Zeilen aus dem Ist-Array löschen, die schon verarbeitet wurden. Das kann aber in die Hose gehen, denn wahrscheinlich ist das ReDim des Ist-Arrays langsamer, als wenn man nicht löscht.
- Der Inhalt der Ist-Ini wird gelöscht und das Soll-Array in die Ist-Ini geschrieben.
Die Main-Ini eines ausgewachsenen Programms, wie z.B. PSPad, kann leicht über 1.500 Zeilen beinhalten. Deshalb würde ich mich freuen, über Ideen und Verbesserungsvorschläge.