Mise à jour des préférences (resuite)
Mise à jour des préférences (resuite)
Toujours là ?
Oui ?
Alors on passe au gros morceau.
UpdateObjectInFile(fichier, objet, codepage, newline)
C'est une fonction à laquelle on va donner au moins un fichier et un objet. Le reste est optionnel.
Et elle va nous retourner ... ben rien du tout, mais elle va faire des choses.
Imaginons le cas suivant : notre application stocke dans un fichier prefs.ini l'emplacement de l'application sous 3 formes.
Comment changer tout ça rapidement ?
À partir de tout ce qu'on a vu ... ou pas. Comme ça :
Le classique E:\MesApplisPortables\MonApplicationPortable\App\MonApplication
La version avec backslash échappés E:\\MesApplisPortables\\MonApplicationPortable\\App\\MonApplication
Et enfin la version URI file:///E:/MesApplisPortables/MonApplicationPortable/App/MonApplication
o_MonObjet := Object()
o_MonObjet.Insert(s_LastAppDir, A_ScriptDir)
o_MonObjet.Insert(StringReplace(s_LastAppDir, "\", "\\", "All"), StringReplace(A_ScriptDir, "\", "\\", "All"))
o_MonObjet.Insert(Path2WSAPI_URI(s_LastAppDir), Path2WSAPI_URI(A_ScriptDir))
UpdateObjectInFile(p_DataDirUnified "\prefs.ini", o_MonObjet)
Je crée un objet, j'y insère des paires (ancienne valeur, nouvelle valeur) puis j'appelle la fonction en lui donnant le nom du fichier à traiter et l'objet contenant tous les changements à faire. Et voilà, c'est fait !
Et en choisissant bien les paires que l'on met dans l'objet on peut même traiter plusieurs fichiers sans redéfinir l'objet. Pour les curieux, regardez le code source du lanceur de GIMPPortable 2.6.11
Problème : certains fichiers sont encodés autrement qu'en ANSI (l'encodage par défaut des fichiers Windows) ou ont d'autres caractères de fin de ligne.
Qu'à cela ne tienne, c'est prévu.
Votre fichier est en UTF-8 sans BOM ?
UpdateObjectInFile(p_DataDirUnified "\prefs.ini", o_MonObjet, "UTF8-RAW") Et hop !
Votre fichier est en UTF-8 avec BOM et avec des fins de ligne type UNIX?
UpdateObjectInFile(p_DataDirUnified "\prefs.ini", o_MonObjet, "UTF8", "LF") Et hop !
Voir FileEncoding pour plus de détail. Si vous changez les fins de lignes, vous devez préciser l'encodage. Le fameux encodage ANSI de Windows correspond à CP1252.
Restez tout de même prudents, notamment lorsqu'il s'agit de faire des remplacement de la lettre du lecteur.
En effet, elle peut aussi être là où vous ne l'attendez pas. C'est du vécu;)
Et comme je suis vicieux, je ne parle des UpdateRegFile que maintenant. C'est aussi parce que c'est nettement plus rapide : il n'y a forcément qu'un seul fichier et il est déjà chargé dans la variable _reglist.
Quelques remplacements comme l'exemple suivant suffisent généralement à traiter le tout :
_reglist := StringReplace(_reglist, s_LastDataDir, p_DataDirUnified, "All")
Up