[R] Modification de valeurs dans un fichier INI

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

[R] Modification de valeurs dans un fichier INI

#1

Message 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.
Modifié en dernier par GMH le dim. 14 févr. 2016 20:16, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#2

Message par orax »

Ben non... j'ai fait un essai en reprenant ton code et IniWrite modifie bien la valeur. Le problème est ailleurs.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#3

Message par mikell »

Le nom des 2 sections "General" est-il strictement identique ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#4

Message 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...
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#5

Message 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...
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#6

Message 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".
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#7

Message 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.
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#8

Message 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.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#9

Message 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.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#10

Message 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.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#11

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#12

Message 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.
Répondre