Konfigurationsdateien (INI) aktualisieren

  • Hey,

    folgendes Problem:

    wenn der Funktionsumfang eines Skriptes wächst, muss ggf. auch mal die Konfigurationsdatei erweitert werden.

    Ich gehe meist so vor:

    [autoit]

    Global $ci_resetini = @AppDataCommonDir & "\ci_reset.ini"

    [/autoit][autoit][/autoit][autoit]

    If Not FileExists($ci_resetini) Then _Createini()

    [/autoit][autoit][/autoit][autoit]

    ; das eigentliche Skript

    [/autoit][autoit][/autoit][autoit]

    Func _Createini()
    IniWrite($ci_resetini, "Settings", "IP", "127.0.0.1")
    IniWrite($ci_resetini, "Settings", "Port", "80")
    IniWrite($ci_resetini, "Settings", "Sleep", 5)
    IniWrite($ci_resetini, "Settings", "restart", 1)

    [/autoit][autoit][/autoit][autoit]

    _FileWriteLog($ci_log, 'CI-reset.ini wurde nicht gefunden und neu erstellt', 1)
    _Exit()
    EndFunc

    [/autoit]

    Sollen in einer neuen Version des Skriptes weitere Einträge in die INI aufgenommen werden, dann schreibe ich diese auch in die Funktion "_Createini()"
    Nur immer wenn das Skirpt schonmal verwendet wurde geht die Abfrage "If Not FileExists($ci_resetini) Then _Createini()" ins Leere und die neuen Einträge werden nicht hinzugefügt.
    Auf der anderen Seite sollen alle bestehenden Einträge auch nicht erneut mit den default-Werten überschrieben werden.

    Eine unkomplizierte Lösung ist mir dafür noch nicht eingefallen und daher würde mich mal interessieren wie ihr sowas löst.

    Gruß nuts

  • Machs doch so:

    [autoit]

    Global $ip, $port, $sleep, $restart
    Global $ci_resetini = @AppDataCommonDir & "\ci_reset.ini"

    [/autoit][autoit][/autoit][autoit]

    _Refresh()

    [/autoit][autoit][/autoit][autoit]

    Func _Refresh()

    [/autoit][autoit][/autoit][autoit]

    $ip = IniRead($ci_resetini, "Settings", "IP", "127.0.0.1")
    $port = IniRead($ci_resetini, "Settings", "Port", "80")
    $sleep = IniRead($ci_resetini, "Settings", "Sleep", 5)
    $restart = IniRead($ci_resetini, "Settings", "Restart", 1)

    [/autoit][autoit][/autoit][autoit]

    IniWrite($ci_resetini, "Settings", "IP", $ip)
    IniWrite($ci_resetini, "Settings", "Port", $port)
    IniWrite($ci_resetini, "Settings", "Sleep", $sleep)
    IniWrite($ci_resetini, "Settings", "restart", $restart)

    [/autoit][autoit][/autoit][autoit]

    _FileWriteLog($ci_log, 'CI-reset.ini wurde erneuert', 1)
    _Exit()
    EndFunc

    [/autoit]

    Einfach alle Werte einmal einlesen, falls sie nicht vorhanden sind, nen starndart Wert setzten und wieder in die ini-file schreiben...

  • Ich hab mich mal ein an einer anderen Lösung versucht.

    Grundgedanke ist dabei, dass man seine Grundkonfig Datei in Editor (oder so) weiterschreibt und mit Fileinstall einbindet.
    Das trägt bei großen INI's auch zu mehr Übersicht im eigentlichen Skript bei.
    Im nächsten Schritt wird die per Fileinstall eingebundene INI mit der schon vorhandenen INI verglichen und fehlende Einträge ergänzt.
    Die schon vorhandenen Einträge bleiben unangetastet.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $konfig_ini = @AppDataCommonDir & "\updatetest.ini"

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($konfig_ini) Then _Createini()
    _Update_konfig_ini()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; das eigentliche Skript

    [/autoit] [autoit][/autoit] [autoit]

    exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _Createini()

    [/autoit] [autoit][/autoit] [autoit]

    FileInstall("D:\autoit\DVBViewer\sendcommand_v2\Sendcommand_config.ini", $konfig_ini)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Update_konfig_ini()
    local $tempfile= @TempDir &"\tempkonfig.ini"
    FileInstall("D:\autoit\DVBViewer\sendcommand_v2\Sendcommand_config.ini", $tempfile)

    [/autoit] [autoit][/autoit] [autoit]

    local $index, $a_section ,$a_tempsection
    local $a_names=IniReadSectionNames($konfig_ini)
    local $a_tempnames=IniReadSectionNames($tempfile)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    for $i=1 to $a_tempnames[0]
    $index=_ArraySearch($a_names, $a_tempnames[$i])
    if @error then
    $a_tempsection=IniReadSection($tempfile, $a_tempnames[$i])
    if @error then ContinueLoop

    [/autoit] [autoit][/autoit] [autoit]

    IniWriteSection($konfig_ini, $a_tempnames[$i], $a_tempsection)
    else
    $a_tempsection=IniReadSection($tempfile, $a_tempnames[$i])
    if @error then ContinueLoop
    $a_section=IniReadSection($konfig_ini, $a_names[$index])

    [/autoit] [autoit][/autoit] [autoit]

    for $u=1 to $a_tempsection[0][0]
    _ArraySearch($a_section, $a_tempsection[$u][0])
    if @error then IniWrite($konfig_ini, $a_names[$index], $a_tempsection[$u][0], $a_tempsection[$u][1])
    Next
    endif

    [/autoit] [autoit][/autoit] [autoit]

    next

    [/autoit] [autoit][/autoit] [autoit]

    FileDelete($tempfile)

    [/autoit] [autoit][/autoit] [autoit]

    ;ShellExecute($konfig_ini) ;debug

    [/autoit] [autoit][/autoit] [autoit]

    endfunc

    [/autoit]

    Sieht nicht schön aus, funktioniert aber. :)