Page 1 sur 1

[R] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 18:09
par GMH
Bonjour,

Dans le but de modifier une valeur dans un fichier INI, j'utilise la fonction : IniWrite(@ScriptDir & "\initialisation.ini", "General", "pause", "15" )

Mais je n'obtiens pas une modification de la valeur "pause" dans la section "General". J'obtiens la création d'une seconde section [General] avec une nouvelle clef "pause". En somme la fonction IniWrite ne modifie pas, elle crée, me retrouvant ainsi avec 2 lignes dans mon fichier : l'ancienne avec sa valeur, et la nouvelle avec la valeur que je tente d'entrer.

Existe-t-il une fonction dédiée à la modification ? Je ne la trouve pas dans l'aide.

Je vous remercie.

Re: [..] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 18:50
par orax
Ben non... j'ai fait un essai en reprenant ton code et IniWrite modifie bien la valeur. Le problème est ailleurs.

Re: [..] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 19:07
par mikell
Le nom des 2 sections "General" est-il strictement identique ?

Re: [..] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 19:30
par GMH
Bonsoir et merci à tous deux,

Oui, les deux sections [General] sont identiques, de même que les clefs.
S'il n'y a pas de fonction spéciale pour modifier les valeurs, j'en conclus que mon code ne doit pas être au top. Je vais regarder ça de près.
Mon fichier INI est en UTF8. Peut-être qu'AutoIt n'apprécie pas...

Re: [..] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 19:45
par GMH
J'ai remarqué que mon programme modifie bien les valeurs de la deuxième section, celle qui s'est rajoutée après toutes les autres. Celle-ci se trouvant donc en queue de fichier INI.
Conclusion, avec un éditeur, j'ai supprimé la section se trouvant en tête de fichier. Et ainsi tout se passe bien.
Je cherche encore...

Re: [..] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 20:05
par orax
Même en UTF-8 je n'ai pas de ce problème. J'ai plutôt un problème d'encodage pour les caractères spéciaux si j'écris avec IniWrite dans un .ini encodé en UTF-8. Il semblerait qu'il soit préférable de l'encoder en UTF16-little Endian. Je n'ai rien trouvé d'officiel pour confirmer ça mais sur la page de IniWriteSection on peut lire : « If you want to use an ini file with unicode encoding, first create an .ini file by using the FileOpen() function with the mode parameter set to "Unicode UTF16 Little Endian". »
Et sur http://www.codeproject.com/Articles/907 ... -INI-files :
Why is it only UTF16-little Endian?

In Notepad included with Windows, we can choose 3 encoding formats in Unicode. These are "Unicode" (UTF16-little Endian), "Unicode big Endian" (UTF16-big Endian), and "UTF-8". We can use only UTF16-little endian of these formats as an INI file format. The other encodings do not work correctly (you examine it once). Probably, the reason is that Windows NT, XP or later uses the encoding internally. This is why Windows particularly names UTF16-little Endian "Unicode".

Re: [..] Modification de valeurs dans un fichier INI

Posté : dim. 14 févr. 2016 20:16
par GMH
Orax, vous avez trouvé le pourquoi de ce curieux phénomène. C'est bien l'UTF8 qui posait problème et c'est bien UTF16-little Endian qui le solutionne !
Vous ne rencontriez pas le problème car votre fichier INI ne comporte sans doute pas de caractères exotiques comme le mien (j'ai des valeurs en alphabet grec dans les sections suivant la section [General]).
Tout va bien maintenant. Mille mercis.

Re: [R] Modification de valeurs dans un fichier INI

Posté : lun. 15 févr. 2016 09:57
par GMH
Bonjour,

Les tests de ce matin me rendent moins enthousiaste qu'hier. Si UTF16-little Endian résout le problème de l'écriture dans le fichier INI, il ne permet pas à mon programme de lire les caractères grecs présents dans certaines sections.
J'ai donc 2 solutions :
1. Rester en UTF8 et insérer en queue de fichier la section modifiée par le programme au cours de son utilisation
2. Créer 2 fichiers INI :
- l'un, non modifiable, en UTF8, contenant les valeurs grecques
- l'autre dont les valeurs sont modifiées par le programme. Les valeurs étant en caractères latins, les encodages ANSI et UTF8 peuvent être utilisés indifféremment.

Pour ma part, je choisis la solution 1 qui m'offre l'économie d'un fichier.

Bonne journée.

Re: [R] Modification de valeurs dans un fichier INI

Posté : lun. 15 févr. 2016 13:18
par jguinch
Il y a certainement un caractère en début de fichier qui empêche la lecture de la section.
Si c'est de l'UTF8, assure-toi qu'il soit sans BOM. C'est surement le BOM qui pose problème.
Sinon, l'ajout d'une ligne vide en début de fichier devrait corriger le problème.

Re: [R] Modification de valeurs dans un fichier INI

Posté : lun. 15 févr. 2016 13:46
par GMH
Mon fichier est bien en UTF8 sans BOM.

L'ajout d'une ligne vide en tête de fichier résout en effet le problème.
J'adopte cette solution dont je vous remercie.

Re: [R] Modification de valeurs dans un fichier INI

Posté : lun. 15 févr. 2016 15:01
par orax
Si la solution actuelle convient je ne vais pas trop insister mais il n'y a pas de raison que ça ne marche pas en UTF16LE avec des caractères exotiques. Et d'après ce que j'ai lu sur internet il semble aussi plus logique que le .ini soit en UTF16LE plutôt qu'en UTF8.

Avec ce code et ce .ini (en UTF16LE) je n'ai aucun problème de lecture/écriture :

Code : Tout sélectionner

IniWrite(@ScriptDir & "\initialisation.ini", "σαµµγ", "ηuuuπ", "œαψγeue...齉")
MsgBox(0, "", IniRead(@ScriptDir & "\initialisation.ini", "σα", "ηπ", ""))
[σα]
ηπ=αψγe
[σαµµγ]
ηπ=αψγe
ηuuuπ=œαψγeue...齉
[σαµµγγ]
ηπ=αψγe
[σαµµγγγ]
ηπ=αψγe
ηuπ=αψγe
ηuuuπ=αψγe
Dans un des messages sur http://autoitscript.fr/forum/viewtopic. ... 828#p96828 j'avais dit d'utiliser BinaryToString($r, $SB_UTF8) mais si le .ini est en UTF16LE il faut bien penser à remplacer ce code par un simple $r. Quand le .ini est en UTF16LE il n'y a pas de conversion à faire.

Re: [R] Modification de valeurs dans un fichier INI

Posté : lun. 15 févr. 2016 19:04
par GMH
Je crois que vous avez le mot de la fin !

C'était bien ces BinaryToString qui contrariaient. Je les ai ôtés et tout fonctionne.

Cette fois-ci le sujet est bien résolu. Merci à tous.