Page 1 sur 2

[Tuto] L'utilisation des fichiers ini

Posté : dim. 15 avr. 2012 22:45
par blacksoul305
Salut tout le monde !

Tout d'abord, ce tutoriel s'adresse aux débutants en AutoIt qui se demandent bien comment se servir d'un fichier .ini, ou d'autres qui se demandent tout simplement ce que c'est et à quoi ça sert. On va donc d'abord définir ce qu'est un fichier .ini.
Wikipédia a écrit :En informatique, un fichier INI est un fichier de configuration dans un format de données introduit par les systèmes d'exploitation Windows en 1985. Par convention les noms de ces fichiers portent l'extension « .ini ».
En d'autre termes, un fichier .ini est utilisé pour stocker des données.

Il faut savoir que le fichier .ini a une architecture bien a lui :

Nous avons d'abord la section, où l'on peut insérer des clefs pour lesquelles chaque clefs a une valeur donnée. Ce qui nous donne :

Code : Tout sélectionner

[Section] ; une section
clef=valeur ; clef avec sa valeur associée
clef2=valeur2 ; seconde clef
[Section2] ; une seconde section
clef3=valeur3 ; etc...
[Section3] ; etc...
clef4=valeur4 ; etc...
Vous allez me dire : "On s'en fiche nous, pour stocker des données, on utilise des variables... T'as pas appris ça ?!"

Bien sûr que si, mais ce genre de fichier va nous donner une certaine liberté. Voici quelques exemples :

Exemple 1 :

Vous êtes sur un programme de chat, le chat est composé d'un ou plusieurs client(s) (les utilisateurs donc) et un serveur, qui se chargera d'envoyer les informations aux différents utilisateurs. Admettons que vous vous êtes préalablement inscrit avec un pseudo, et que pour ne pas vous confondre, le serveur a enregistré votre adresse IP. Vous vous amusez ensuite à flooder votre ami via MP. Bah, le pseudo et l'IP faut les enregistrer, et les variables c'est bien beau mais ça ralentirait beaucoup trop le serveur. Voilà comment monsieur le serveur va procéder :

Client1(vous) >>>envoie le message+IP>>>[Serveur(reçoit l'IP, cherche dans la section "membres" clef "votreIP" et trouve "votre pseudo")]>>>envoie votre message+pseudo>>>Client2(ami) sait dorénavant qui est entrain de l'embêter et qui il va bientôt bloquer...

C'est aussi simple que ça !

Pour l'exemple2, je le donnerai à la fin puisque je vais vous proposer un TP :twisted: .

Mais, de quoi a t-on besoin pour faire ce genre de choses ? Nous allons utiliser toutes les commandes que nous offre AutoIt pour la gestion de fichiers .ini.

Commandes :

Code : Tout sélectionner

IniWrite("le_nom_de_votre_fichier.ini","la_section","la_clef","sa_valeur")
Sachez que pour placer votre fichier .ini où vous voulez, vous pouvez carrément copier-coller un chemin : $le_nom_du_fichier = "C:\Program Files\monIni.ini" ou bien utiliser les macros : $le_nom_du_fichier = @ProgramFilesDir&"\monIni.ini"

Code : Tout sélectionner

IniDelete("le_nom_de_votre_fichier.ini","la_section"[,"la_clef")
Si vous rentrez toutes les informations, vous supprimerez la clef et sa valeur, si vous mettez juste le fichier et la section, vous supprimerez la section entière !

Code : Tout sélectionner

IniRead("le_nom_du_fichier.ini","la_section","la_clef","default")
Cette commande doit être placée dans une variable : $lecture = IniRead(....). Vous lirez la valeur d'une clef demandée qui sera placée dans la variable $lecture, que vous pourrez afficher/modifier etc...

Code : Tout sélectionner

IniRenameSection("le_nom_de_votre_fichier.ini","la_section","la_nouvelle_section[,flag)
Cette fonction sert à renommer une section, le flag est mit par défaut à 0, ce qui veut dire que si la nouvelle section que vous voulez ajoutée existe, il ne la remplace pas. Par contre si vous le mettez à 1, alors il supprimera les clefs/valeurs de la section.

Code : Tout sélectionner

IniWriteSection("le_nom_de_votre_fichier.ini","la_section","la_clef=sa_valeur"&@LF&"la_clef2=sa_valeur")
Cette commande vous permettra d'écrire une section et les clefs + leurs valeurs associées. Vous pouvez en fait écrire plusieurs clefs et valeurs à condition de placer la macro @LF entre chaque ensemble clef/valeur. Si par contre vous voulez écrire les valeurs grâce à un array, je ne préfère pas dire de bêtise car je n'y arrive pas, je laisse donc ceux qui savent, proposer la solution pour que je puisse l'inscrire ici. Pareil pour l'index.

Nous approchons des commandes plus compliquées maintenant, puisqu'elles demandent l'utilisation des tableaux.

Code : Tout sélectionner

IniReadSection("le_nom_de_votre_fichier.ini","la_section")
Cette commande vous retournera un "array", un tableau en fait, contenant les clefs et leurs valeurs de la section choisie.

Pour cela nous avons besoin de traiter ligne par ligne le fichier à l'aide d'une boucle. Voici un code commenté !

Code : Tout sélectionner

fichier.ini
[section]
clef=2
clef2=4

Code : Tout sélectionner

$ini = @ScriptDir&"\fichier.ini" ; on place le fichier ini dans une variable pour éviter de le ré-écrire.

$lop = IniReadSection($ini,"section") ; on appelle la commande placée dans une variable
For $i = 1 To $lop[0][0] ; on s'apprête à lire toutes les lignes de la section
MsgBox(0,"lop","clef : "&$lop[$i][0]&" "&"valeur : "&$lop[$i][1]) ; on affiche le nom de la clef et sa valeur pour chaque ligne
Next ; fin de la boucle, il n'y a plus rien dans la section
Vous aimez ça ? Allez, dans le même style !!

Code : Tout sélectionner

IniReadSectionNames("le_nom_de_votre_fichier.ini")
Cette commande là comme la précédente vous servira à répertorier toutes les sections du ini et vous donner leurs noms.

Code : Tout sélectionner

fichier.ini
[section]
[mortderire]
[encoreUneSection]
[etUneDePlus]

Code : Tout sélectionner

$ini = @ScriptDir&"\fichier.ini" ; on place le fichier ini dans une variable pour éviter de le ré-écrire.

$lop = IniReadSectionNames($ini) ; On place notre commande dans une variable
For $i = 1 To $lop[0] ;on commence la boucle pour analyser ligne par ligne le fichier
    MsgBox(0,"lop",$lop[$i]) ; on affiche le nom de la section pour chaque section
Next
EDIT : Après avoir vu un message partir à la poubelle, je décide de rajouter la réponse (même si ça coule de source).
benhsaien a écrit :Bonjour,
je travaille avec autoit pour l'automatisation des test,ma question est : y'a t'il un moyen pour compter nombre de section d'un fichier .ini

Merci d'avance
Alors comment on compte le nombre de sections ?! Vous avez une idée ?

Indice :

Code : Tout sélectionner

IniReadSectionNames()
Bon, allez tenez !
► Afficher le texteSolution
C'était pas dur hein ? :)

Maintenant que nous avons fini avec toutes ces commandes, je vais vous demander de réaliser cet exemple 2.

Exemple 2 : (cahier des charges)

"Bonjour, je suis directeur d'une maison de refuges pour les animaux de mon village, tout particulièrement de chats et de chiens. J'aimerai que vous me fassiez un programme avec une petite interface graphique, avec lequel je pourrai ajouter ou supprimer un chat ou chien rentrant ou sortant de ma maison. Aussi, j'aimerai avoir un petit bouton pour voir défiler chaque chat ou chien avec son nom et son age. Par contre, puisque je suis maladroit, il m'arrive de me tromper et donc de mal rentrer des informations. Vous veillerez à ce que cela ne perturbe pas mon programme. Je vous remercie !"

A partir du cahier des charges, vous créerez une interface graphique répondant aux besoins de Dédé, vous gérerez aussi un fichier SPA.ini avec l'architecture correcte qui va avec.

Bonne chance !

Si vous êtes là, c'est que :

Code : Tout sélectionner

$Local $est_ici

Switch $est_ici
    Case $n_a_pas_compris
        MsgBox(16,"NOOOOOON !!","J'espère que ma correction va t'aider !")
    Case $veux_corriger
        MsgBox(16,"Attention !!" !!","J'espère que tu as juste !")
Endswitch
Bref, la correction et les fichiers qui vont avec sont en ci-joints au tutoriel. J'espère que vous vous utiliserez tout plein de fichiers .ini et à bon escient !!

Re: [Tuto] L'utilisation des fichiers ini

Posté : lun. 16 avr. 2012 00:31
par Iste
Beaucoup d’imprécision dans le texte, mais dans l'ensemble ça devrait répondre aux questions qu'on beaucoup de débutants avec les .ini

Re: [Tuto] L'utilisation des fichiers ini

Posté : lun. 16 avr. 2012 11:31
par blacksoul305
Bonjour Iste,
Iste a écrit :Beaucoup d’imprécision dans le texte
C'est vrai que je m'en doutais un peu, surtout dans les commentaires de certaines commandes, mais par peur de mettre une bêtise, je préfère que ceux qui sont sures, proposent leurs remarques pour que je puisse les inscrire.
Iste a écrit :mais dans l'ensemble ça devrait répondre aux questions qu'on beaucoup de débutants avec les .ini
Ça va, ça a l'air d'être positif ! C'était le but du tutoriel en même temps !

Merci !

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 08:05
par kiicri
Merci pour ce tuto.
Débutant débutant, il me sera d'une grande utilité :) .
Kii

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 11:59
par mikell
Sympa tuto
Tiens une petite fonction d'affichage de ini (pratique pour faire une listview) :wink:
► Afficher le texte

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 14:57
par blacksoul305
kiicri et mikell : Merci pour vos encouragements, ça me fait plaisir que ce tutoriel puisse aider et plaire à la fois !

mikell : Oui, j'avais l'idée de la ListView mais ça cette époque là, je ne la maîtrisais pas totalement et voulant rester dans un tutoriel pour débutant, j'ai préféré quelque chose de simple.

Cela dit, peut-être faire une partie avancée car j'ai fais un prog utilisant une listview gérée par un .ini, et ça mérite d'être vu car c'est franchement utile !

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 15:04
par Tlem
L'utilisation des expressions régulières pour recréer l'existant est un très bon exercice de style, mais je doute que cela soit d'une grande utilité pour un débutant !

Les fonctions intégrées suffisent largement à faire la même chose sans expressions régulières ...

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 15:13
par mikell
C'était effectivement un exercice de style :wink:
Tout en ayant conscience (bien sûr) de légèrement sur les bords réinventer la roue... :mrgreen:
Tiens ça c'est beaucoup plus propre
► Afficher le texte

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 15:18
par Tlem
Dans ce cas, il faudrait modifier légèrement ta signature ...
La solution la plus simple est toujours la meilleure (Mon grand-père)
Mais j'aime bien explorer les solutions plus complexes !

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 15:38
par timmalos
N'oubliez pas cet exemple qui est une gui pour afficher et modifier un .ini
http://autoitscript.fr/forum/viewtopic.php?f=6&t=8183

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 17:39
par mikell
Mais j'aime bien explorer les solutions plus complexes !
Ben oui j'avoue ... Image
Quoique, solution différente oui, mais plus complexe pas tellement
En fait une fois qu'on a compris les 3 regexp (qui sont très simples) le reste n'est que de l'affichage d'array comme on pourrait le faire en utilisant les fonctions ini, et d'ailleurs je suis pas sûr qu'avec les fonctions ini ça ferait un script tellement plus court

@timmalos
Ton script est un monstre :mrgreen:
Mais il renvoie un message d'erreur si le ini contient une section vide (ce qui peut arriver), et dommage qu'il soit limité à l'édition des valeurs

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 23:00
par Tlem
En ce qui me concerne, je préfère ce genre de code et d'affichage :
► Afficher le texte
Par contre, en faisant mes tests, je me retrouve avec quelque chose d'étrange avec la fonction IniReadSectionNames() lorsque je veux lire le fichier win.ini du répertoire Windows !!!
Celui-ci retourne un nombre de sections plus importantes que ce qui y est réellement !!!
Je me suis dit au début que j'avais un peut trop abusé de la Despé, mais après avoir remplacé le fichier win.ini originel par un fichier modifié (une seule section et une seule clé), IniReadSectionNames() me trouve toujours des sections inexistantes dans ce fichier. :shock:

Si quelqu'un pouvait faire quelques tests afin de confirmer ou d'infirmer ce comportement, je lui en serait grès.

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 23:19
par blacksoul305
Tlem a écrit :Si quelqu'un pouvait faire quelques tests afin de confirmer ou d'infirmer ce comportement, je lui en serait grès.
Pour moi ce sera 37 sections alors que j'en vois seulement 8.

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 23:27
par mikell
Je confirme :shock:
Ton script renvoie des résultats tout à fait surprenants avec "C:\WINDOWS\win.ini" : sections en plus, ou sections existantes mais contenu différent
Très inattendu et spectaculaire Image

Cela dit je me sens moralement obligé de te faire remarquer (au passage) que mon script te retourne le contenu de win.ini avec une exactitude et une précision d'horlogerie suisse :P

Edit : et vlan pour les fonctions intégrées :twisted:

Re: [Tuto] L'utilisation des fichiers ini

Posté : sam. 21 juil. 2012 23:30
par blacksoul305
Vous pouvez rien dire boss, le chat orange marque un point. :lol:

Re: [Tuto] L'utilisation des fichiers ini

Posté : dim. 22 juil. 2012 00:28
par Tlem
mikell a écrit :et vlan pour les fonctions intégrées :twisted:
Généralement, les fonctions intégrées sont certainement plus stables qu'une expression régulière qui peut être sensible à divers cas non prévus.

En l'occurence, nous nous trouvons sans doute en présence d'un sacré bug que je signalerais demain si d'autres confirme ce fonctionnement plus qu'étrange. :wink:

Re: [Tuto] L'utilisation des fichiers ini

Posté : dim. 22 juil. 2012 00:30
par blacksoul305
Pourquoi le bug en question n'affecterait seulement un fichier ini et en particulier celui se trouvant dans le répertoire WINDOWS ? Je ferai des tests de mon côté, et vous tiendrez au courant.

Re: [Tuto] L'utilisation des fichiers ini

Posté : dim. 22 juil. 2012 01:16
par mikell
Tlem a écrit :Généralement, les fonctions intégrées sont certainement plus stables qu'une expression régulière qui peut être sensible à divers cas non prévus.
Je le sais bien mais là tout de suite tu ne m'enlèveras pas ces quelques instants d'intense jubilation :twisted:
Sont tout spécialement appréciés : "Généralement" et les "divers cas non prévus"

Bon plus sérieusement, on a aussi la blague avec "C:\WINDOWS\system.ini" , mais pas avec d'autres ini présents dans C:\WINDOWS
Apparemment c'est sur les ini système de windows, faudrait en tester d'autres pour voir

Re: [Tuto] L'utilisation des fichiers ini

Posté : dim. 22 juil. 2012 09:22
par jguinch
Bonjour
J'ai reproduit le bug sur mon PC (Windows 7 64), aussi bien compilé en 32 ou 64 bits.
Tu avais raison, Tlem, Le bug apparaît également avec system.ini
Bizarre aussi, si on fait IniReadSectionNames(@ScriptDir & "\win.ini"), ça fonctionne même si le fichier n'existe pas.

Peut être que c'est voulu, vu les valeurs retounées... Mais ça n'explique pas pourquoi @ScriptDir & "\win.ini" renvoi des valeurs...

Re: [Tuto] L'utilisation des fichiers ini

Posté : dim. 22 juil. 2012 10:41
par Tlem
@jguinchard
Effectivement, c'est encore plus étrange ...

@mikell
Même si ce que j'ai relevé montre un bug évident dans IniReadSectionNames, ta fonction n'en est pas moins dépourvue ...
En effet dans certains cas non prévus :roll: , ta fonction retourne un nombre erroné de sections. :mrgreen:
En faisant quelques tests sur divers fichiers .ini, je suis tombé sur deux fichiers dont certaines lignes ont été commentées. 8)

Bon, je m'en vais de ce pas exposer cet étrange phénomène sur le forum US. Nous verrons bien ce qu'ils répondrons.

Edit :
Pour ceux qui vaudraient suivre cette actualité, c'est par ici : http://www.autoitscript.com/forum/topic ... tionnames/