Lire et écrire dans un fichier ini

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 220 fois - Téléchargée 57 fois

Contenu du snippet

Ce source permet d'écrire d'extraire et de modifier les valeurs des variables contenues dans les fichiers ini.
Ce code permet de lire les fichiers ini dont chaque ligne peut contenir des espaces non significatifs et effectue aussi quelques tests. En effet, si la variable ou la section est contenue dans un commentaire (ligne commençant par ";") alors elle est ignorée. Exemple : si l'on cherche la section [section], elle ne sera pas trouvée dans cette ligne :
; ceci est une ligne de commentaires contenant [section]
De même, le fichier peut contenir des espaces, la lecture se fera quand même. Exemple : si l'on recherche la variable "variable", elle sera trouvée dans ces cas :
variable=valeur
variable=valeur
variable =valeur
variable = valeur
Par contre, dans les cas ci-dessous, elle ne sera pas pris en compte :
; ceci est une ligne de commentaire contenant par hasard la chaine variable
longvariable = valeur
variables = valeur

Source / Exemple :


Public Function GetFile(Filename As String)
' renvoie le contenu du fichier "filename" sous forme d'une seule chaine de caractères
Dim a As Long
a = FreeFile()
Open Filename For Input As #a
     GetFile = Input(LOF(a), a)
Close #a
End Function

Public Function GetFileExist(Filename As String) As Boolean
' renvoie true si le fichier "filename" existe et false sinon
On Error GoTo Erreur
FileLen (Filename)
GetFileExist = True
Exit Function
Erreur:
GetFileExist = False
End Function

Public Function simplifie(texte As String)
' supprime les retours à la ligne trop nombreux ( lorsqu'il y a 3 retours à la ligne,
' on n'en laisse que 2)
Dim retour As String
Dim l As String
retour = Chr(13) & Chr(10)
l = InStr(texte, retour & retour & retour)
While l <> 0
texte = Left(texte, l + 1) & Mid(texte, l + 4)
l = InStr(texte, retour & retour & retour)
Wend
simplifie = texte
End Function

Public Function supprime(texte As String)
'supprime tous les retours à la ligne placés en fin de chaine
Dim retour As String
Dim l As String
retour = Chr(13) & Chr(10)
l = Mid(texte, Len(texte) - 1) = retour
While l
texte = Mid(texte, 1, Len(texte) - 2)
l = Mid(texte, Len(texte) - 1) = retour
Wend
supprime = texte
End Function

Public Function SetFile(Filename As String, texte As String)
' écrit la chaine de caractère "texte" dans le fichier "filename" (écrase l'ancien)
Dim a As Long
a = FreeFile()
Open Filename For Output As #a
Print #a, supprime(simplifie(texte))
Close #a
End Function

Public Function GetIni(Filename As String, Contener As String, Variable As String)
'renvoie la valeur de la variable "variable" placée dans le conteneur "contener"
' renvoie la chaine vide si la variable n'a pas été trouvé
Dim test As Boolean, _
          t1 As Boolean, _
          t2 As Boolean, _
       ligne As String, _
           a As Long, _
      retour As String
retour = Chr(13) & Chr(10)
' si le fichier n'existe pas
If Not GetFileExist(Filename) Then
 GetIni = ""
 Exit Function
End If
' ouvertur du fichier
a = FreeFile()
Open Filename For Input As #a
' recherche du conteneur
test = True
t2 = True
While test
  If Not EOF(a) Then
     'lecture de la ligne
     Line Input #a, ligne
     'test si "[container]" est inclus en début de ligne
     ' (avec des espaces possible à sa gauche)
     t2 = InStr(UCase(Trim(ligne)), UCase("[" & Contener & "]")) <> 1
  End If
  test = (Not EOF(a)) And t2
Wend
' si le conteneur n'a pas été trouvé
If EOF(a) And t2 Then
 GetIni = ""
 Exit Function
End If
' recherche la variable
ligne = ""
test = True
t1 = True
t2 = True
While test
  If Not EOF(a) Then
     Line Input #a, ligne
     ' test si l'on n'a pas atteint le conteneur suivant
     t1 = Mid(Trim(ligne), 1, 1) <> "["
     ' test si la variable (suivant du symbole "=" ) est inclus dans la ligne courante
     t2 = InStr(LCase(Trim(ligne)), LCase(Variable)) <> 1 Or _
          Mid(Trim(Mid(Trim(ligne), Len(Variable) + 1)), 1, 1) <> "="
  End If
  test = (Not EOF(a)) And t1 And t2
Wend
If t2 Then
    GetIni = ""
Else
    ' c'est le cas où la variable a été trouvé, on en extrait la valeur
    GetIni = Trim(Mid(ligne, InStr(ligne, "=")))
End If
End Function

Public Function WriteIni(Filename As String, Contener As String, Variable As String, Value As String)
' ecriture de la valeur "valeur" de la variable "variable" dans la section "contener" et ce
' dans le fichier "filename". Si le fichier n'existe pas, on le crée,si la section
' n'existe pas, on la crée, si la variable n'existe pas, on la crée. Si la section et la
' variable existe alors on met à jour la valeur de la variable (écrasement de l'ancienne valeur)

Dim Resultat As String, _
        test As Boolean, _
          t1 As Boolean, _
          t2 As Boolean, _
       ligne As String, _
           a As Long, _
      retour As String
retour = Chr(13) & Chr(10)
' si le fichier n'existe pas, on le crée et on y met le container, la variable et sa valeur
If Not GetFileExist(Filename) Then
 Call SetFile(Filename, "[" & Contener & "]" & retour & Chr(32) & Variable & "=" & Value)
 Exit Function
End If
' ouvertur du fichier
a = FreeFile()
Open Filename For Input As #a
' recherche du conteneur
test = True
t2 = True
While test
  If Not EOF(a) Then
     'lecture de la ligne
     Line Input #a, ligne
     'test si "[container]" est inclus en début de ligne (avec des espaces possible à sa gauche)
     t2 = InStr(UCase(Trim(ligne)), UCase("[" & Contener & "]")) <> 1
     Resultat = Resultat & ligne & retour
  End If
  test = (Not EOF(a)) And t2
Wend
' si le conteneur n'a pas été trouvé, on le crée ainsi que la variable et sa valeur
If EOF(a) And t2 Then
 Close #a
 Call SetFile(Filename, Resultat & retour & "[" & Contener & "]" & retour & Chr(32) & Variable & "=" & Value & retour)
 Exit Function
End If
' recherche la variable
ligne = ""
test = True
t1 = True
t2 = True
While test
  If Not EOF(a) Then
     Line Input #a, ligne
     t1 = Mid(Trim(ligne), 1, 1) <> "["
     t2 = InStr(LCase(Trim(ligne)), LCase(Variable)) <> 1 Or _
          Mid(Trim(Mid(Trim(ligne), Len(Variable) + 1)), 1, 1) <> "="
     If t1 And t2 Then
      Resultat = Resultat & ligne & retour
     End If
  End If
  test = (Not EOF(a)) And t1 And t2
Wend
If t2 Then
 'la variable est absente, on la crée à la fin du conteneur (avant le suivant)
 Resultat = supprime(Resultat) & retour & Chr(32) & Variable & "=" & Value & retour & retour
 Resultat = Resultat & ligne & retour
Else
 'la variable est présente
 Resultat = Resultat & Mid(ligne, 1, InStr(ligne, "=")) & Chr(32) & Value & retour
End If
While Not EOF(a)
  Line Input #a, ligne
  Resultat = Resultat & ligne & retour
Wend
 Close #a
 Call SetFile(Filename, Resultat)
End Function

A voir également

Ajouter un commentaire

Commentaires

cs_clad87
Messages postés
42
Date d'inscription
samedi 28 décembre 2002
Statut
Membre
Dernière intervention
24 août 2015

Ton code est buggué:

' ouvertur du fichier
a = FreeFile()

il ne peut pas ouvrir plus de 450 fichier (tu as peut etre oublier de les refermer.. ?)
virginie1575
Messages postés
12
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
29 juin 2004

Coucou, c rigolo de lire les commentaires ! Vous vous battez tous pour la même chose ! En tt cas, il n'y a pas de meilleure solus, elles sont ttes correctes mais il y en a juste des + performantes que d'autres ! Je vous souhaite une bonne continuation à tous.
PS : merci z980x, g trouvé dans ton code juste la petite partie qui me manquait ! (writeINI) merci tchao !
Biz à tous
ZZEBULON
Messages postés
17
Date d'inscription
mardi 1 juillet 2003
Statut
Membre
Dernière intervention
23 février 2010

On peut aussi ouvrir un objet word et se servir de la propriété System.PrivateProfileString ça prend 3 lignes!
z980x
Messages postés
898
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
26 juillet 2007
2
http://www.vbfrance.com/article.aspx?ID=35 Plus court et plus simple, en un mot, le meilleur...
warreng69
Messages postés
12
Date d'inscription
jeudi 21 novembre 2002
Statut
Membre
Dernière intervention
13 avril 2004

svp est ce que kelk un possederai une source avec une fonction de lecture d'un fichier ini avec seulement le nom du fichier en parametres.
merci
et je souhaiterai egalement savoir comment le fichier ini peut etre lu (chargé) par une application.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.