Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Editer le nom d'une section dans in fichier .INI

16 réponses
Avatar
Fournier Raymond
Bonjour a tous,
Je voudrais savoir qu'elle est la meilleure façon d'éditer par le
code le nom d'une section d'un fichier.ini. Si on utilise les api pour
gérer les fichiers ini et que l'on édite le nom de la section il y aura une
nouvelle section avec le nom corriger.

merci de votre aide

10 réponses

1 2
Avatar
François Picalausa
Hello,

une façons agricole de renommer une section serait de lire tout l'ini et
d'applique un
Replace(strFileContent, "[" & SectionOrigine & "]", "[" & NouvelleSection &
"]")

Exemple (non testé):
Sub RenameSection(OldName As String, NewName As String, IniFile As String)
Dim strBuffer As String, FFN as integer
FFN = FreeFile

Open IniFile For Binary As FFN
strBuffer = String$(LOF(1), vbNullChar)
Get FFN,, strBuffer
Close FFN

strBuffer = Replace(strBuffer, "[" & OldName & "]", "[" & NewName & "]")

Kill IniFile
Open IniFile For Binary As FFN
Put ,, strBuffer
Close FFN
End Sub

En passant par les API, il faudrait:
Lire toutes les clés d'une section (GetPrivateProfileSection)
Supprimer la section (WritePrivateProfileString, lpKeyName = NULL)
Splitter les clés récupérées
Boucler sur l'ensemble de clés
Ecrire chaque clé (WritePrivateProfileString)

AMHA c'est moins rapide... mais il faudrait un bench pour s'en assurer.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Fournier Raymond" <duracelle(Enlever-ceci)@sympatico.ca> a écrit dans
le message de news:
Je voudrais savoir qu'elle est la meilleure façon d'éditer par le
code le nom d'une section d'un fichier.ini. Si on utilise les api pour
gérer les fichiers ini et que l'on édite le nom de la section il y
aura une nouvelle section avec le nom corriger.


Avatar
Zoury
amha, tu devrais de recréer le fichier en remplaçant le nom de section.. tu
peux employer les instructions Open/Close pour y parvenir...

Ex :
contenu du fichier c:ini.ini:
[SECTION1]
KEY=MA_VALEUR

[SECTION2]
KEY=MA_VALEUR

[SECTION3]
KEY=MA_VALEUR


code VB
'***
' Module1
Option Explicit

Private Sub Main()
Call ReplaceInFile("c:ini.ini", "SECTION2", "MA NOUVELLE SECTION")
End Sub

Private Sub ReplaceInFile _
( _
ByRef sFilePath As String, _
ByRef sFind As String, _
ByRef sReplace As String, _
Optional ByRef lStart As Long = 1, _
Optional ByRef lCount As Long = 1, _
Optional ByRef lCompare As VbCompareMethod = vbBinaryCompare _
)
Call WriteFile(sFilePath, Replace(ReadFile(sFilePath), sFind,
sReplace, lStart, lCount, lCompare))
End Sub

Private Function FileExists(ByRef sFilePath As String) As Boolean
On Error Resume Next
FileExists = (GetAttr(sFilePath) And vbDirectory) = 0
End Function

Private Function ReadFile(ByRef sFilePath As String) As String

Dim hFile As Long

If (Not FileExists(sFilePath)) Then
Call Err.Raise(53) ' File not found
Exit Function
End If

hFile = FreeFile
Open sFilePath For Binary As #hFile
ReadFile = Space$(LOF(hFile))
Get #hFile, , ReadFile
Close #hFile

End Function

Private Sub WriteFile _
( _
ByRef sFilePath As String, _
ByRef sText As String, _
Optional ByRef bOverwrite As Boolean = True _
)

Dim hFile As Long

If (FileExists(sFilePath)) Then
If (bOverwrite) Then
Call Kill(sFilePath)
Else
Exit Sub
End If
End If

hFile = FreeFile
Open sFilePath For Binary As #hFile
Put #hFile, , sText
Close #hFile

End Sub
'***

contenu du fichier c:ini.ini après l'exécution:
[SECTION1]
KEY=MA_VALEUR

[MA NOUVELLE VALEUR]
KEY=MA_VALEUR

[SECTION3]
KEY=MA_VALEUR

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
"Fournier Raymond" <duracelle(Enlever-ceci)@sympatico.ca> a écrit dans le
message de news:
Bonjour a tous,
Je voudrais savoir qu'elle est la meilleure façon d'éditer par le
code le nom d'une section d'un fichier.ini. Si on utilise les api pour
gérer les fichiers ini et que l'on édite le nom de la section il y aura


une
nouvelle section avec le nom corriger.

merci de votre aide


Avatar
François Picalausa
Hello,

Ma solution n'était déja pas terrible...
Maus si on essaye avec ton code avec
[SECTION2]
KEY=MA_VALEUR

[SECTION23]
KEY=MA_VALEUR

(toujours en remplaçant SECTION2 par MA NOUVELLE SECTION), je crains le pire
;-)
Maintenant, même ma solution remplaçant [SECTION2] par [MA NOUVELLE SECTION]
n'est pas sûre à 100%.
Supposons qu'une clé ait pour valeur (enfin.. il faudrait voir si ce genre
de syntaxe est admise mais je crois que oui)
MYKEY=[SECTION2]

Ou comment générer des erreurs dans les données d'un fichier ini... Donc il
faudrait bien passer par les API qui parseront le fichier, comme indiqué à
la fin de mon post...

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zoury" a écrit dans le message de
news:
Call ReplaceInFile("c:ini.ini", "SECTION2", "MA NOUVELLE
SECTION") End Sub


Avatar
Zoury
hmmm... et supposons les deux même sections,

[SECTION2]
[SECTION23]



il suffirait de rechercher "[SECTION2]" et remplacer par "[quelque
chose...]" et on serait certain de l'unicité de la modification, non ?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
François Picalausa
Hello,

Je vais me répéter :-)
<quote src="news:">
[...]
Maintenant, même ma solution remplaçant [SECTION2] par [MA NOUVELLE SECTION]
n'est pas sûre à 100%.
Supposons qu'une clé ait pour valeur (enfin.. il faudrait voir si ce genre
de syntaxe est admise mais je crois que oui)
MYKEY=[SECTION2]
[...]
</quote>

En réfléchissant encore un peu (ça devient difficile... j'y perds mon
dernier neurone s'use à force!), on pourrait filtrer les entrées
-en début de fichier suivies de crlf
-délimitées par crlf des deux côtés
-commençant par crlf et terminant le fichier
Celà revient à splitter le fichier - split(contenu, vbcrlf) - suivit d'un
parcours du tableau et comparaison de chaque entrée avec [section]

Maintenant, concocter un algo pour compacter mes posts, qu'ils soient lus
jusqu'au bout ;-)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zoury" a écrit dans le message de
news:
il suffirait de rechercher "[SECTION2]" et remplacer par "[quelque
chose...]" et on serait certain de l'unicité de la modification, non ?


Avatar
Zoury
naaa.. mon cerveau n'a pas lu ça :
MYKEY=[SECTION2]
Celà revient à splitter le fichier - split(contenu, vbcrlf) - suivit d'un
parcours du tableau et comparaison de chaque entrée avec [section]



dans ce cas autant utiliser CFile... :O)

fichier ini.ini :
[SECTION1]
KEY=[SECTION2]

[SECTION2]
KEY=MA_VALEUR

[SECTION3]
KEY=[SECTION2]

code
'***
' Module1
Option Explicit

Private Sub Main()
Call RenameINISection("c:ini.ini", "SECTION2", "MY_NEW_SECTION")
End Sub

Private Sub RenameINISection(ByRef sFilePath As String, ByRef sOldSection As
String, ByRef sNewSection As String)

Dim f As CFile
Dim i As Long
Dim lLen As Long

If (Not FileExists(sFilePath)) Then
Call Err.Raise(53) ' File not found
Exit Sub
End If

If (Left$(sOldSection, 1) <> "[") Then sOldSection = "[" & sOldSection
If (Right$(sOldSection, 1) <> "]") Then sOldSection = sOldSection & "]"
If (Left$(sNewSection, 1) <> "[") Then sNewSection = "[" & sNewSection
If (Right$(sNewSection, 1) <> "]") Then sNewSection = sNewSection & "]"

Set f = New CFile
lLen = Len(sOldSection)
Call f.OpenFile(sFilePath)
For i = 1 To f.LineCount
If (Left$(f.Lines(i), Len(sOldSection)) = sOldSection) Then
f.Lines(i) = Replace(f.Lines(i), sOldSection, sNewSection)
Call f.SaveFile
Exit For
End If
Next i

End Sub

Private Function FileExists(ByRef sFilePath As String) As Boolean
On Error Resume Next
FileExists = (GetAttr(sFilePath) And vbDirectory) = 0
End Function
'***

au final :
[SECTION1]
KEY=[SECTION2]

[MY_NEW_SECTION]
KEY=MA_VALEUR

[SECTION3]
KEY=[SECTION2]

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
ng
Salut,

Essaye cette fonction :

Public Sub IniRenameSection(strPath As String, strOldName As String,
strNewName As String)
Dim k As Integer, strBuffer As String, tblLines() As String
k = FreeFile
Open strPath For Binary As #k
strBuffer = String$(LOF(k), vbNullChar)
Get #k, , strBuffer
Close #k
tblLines = Split(strBuffer, vbCrLf): strBuffer = ""
For k = 0 To UBound(tblLines)
If tblLines(k) Like "[[]" & strOldName & "[]]" Then
tblLines(k) = "[" & strNewName & "]"
Exit For '//BREAK
End If
Next
strBuffer = Join(tblLines, vbCrLf)
k = FreeFile
Open strPath For Output As #k
Print #k, strBuffer;
Close #k
End Sub


'//Exemple d'utilisation

Call IniRenameSection("C:Mon Ini.ini", "MaSection",
"MaNouvelleSection")

Attention cette fonction par défaut sensible à la casse, pour empecher cela
il suffit d'ajouter un Option Compare Text dans les déclarations du module
de code en cours.



--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Fournier Raymond <duracelle(Enlever-ceci)@sympatico.ca> a écrit :

Bonjour a tous,
Je voudrais savoir qu'elle est la meilleure façon d'éditer par le
code le nom d'une section d'un fichier.ini. Si on utilise les api pour
gérer les fichiers ini et que l'on édite le nom de la section il y
aura une nouvelle section avec le nom corriger.

merci de votre aide


Avatar
Fournier Raymond
"Zoury" wrote in
news::

naaa.. mon cerveau n'a pas lu ça :
MYKEY=[SECTION2]
Celà revient à splitter le fichier - split(contenu, vbcrlf) - suivit
d'un parcours du tableau et comparaison de chaque entrée avec
[section]



dans ce cas autant utiliser CFile... :O)

fichier ini.ini :
[SECTION1]
KEY=[SECTION2]

[SECTION2]
KEY=MA_VALEUR

[SECTION3]
KEY=[SECTION2]

code
'***
' Module1
Option Explicit

Private Sub Main()
Call RenameINISection("c:ini.ini", "SECTION2", "MY_NEW_SECTION")
End Sub

Private Sub RenameINISection(ByRef sFilePath As String, ByRef
sOldSection As String, ByRef sNewSection As String)

Dim f As CFile
Dim i As Long
Dim lLen As Long

If (Not FileExists(sFilePath)) Then
Call Err.Raise(53) ' File not found
Exit Sub
End If

If (Left$(sOldSection, 1) <> "[") Then sOldSection = "[" &
sOldSection If (Right$(sOldSection, 1) <> "]") Then sOldSection > sOldSection & "]" If (Left$(sNewSection, 1) <> "[") Then
sNewSection = "[" & sNewSection If (Right$(sNewSection, 1) <> "]")
Then sNewSection = sNewSection & "]"

Set f = New CFile
lLen = Len(sOldSection)
Call f.OpenFile(sFilePath)
For i = 1 To f.LineCount
If (Left$(f.Lines(i), Len(sOldSection)) = sOldSection) Then
f.Lines(i) = Replace(f.Lines(i), sOldSection, sNewSection)
Call f.SaveFile
Exit For
End If
Next i

End Sub

Private Function FileExists(ByRef sFilePath As String) As Boolean
On Error Resume Next
FileExists = (GetAttr(sFilePath) And vbDirectory) = 0
End Function
'***

au final :
[SECTION1]
KEY=[SECTION2]

[MY_NEW_SECTION]
KEY=MA_VALEUR

[SECTION3]
KEY=[SECTION2]




Merci a tous de vos réponses. Est-ce que lire la section, la placer dans
un tableau, supprimer la section, recréé une section et ré-écrire les
clés est une façon propre.

Merci Raymond Fournier.
Avatar
ng
Salut,

Je ne penses pas que ce soit la meilleure facon. Le plus propre je pense de
renommer la section en parcourant le fichier, regarde mon code ou celui de
Zoury.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Fournier Raymond <duracelle(Enlever-ceci)@sympatico.ca> a écrit :

"Zoury" wrote in
news::

naaa.. mon cerveau n'a pas lu ça :
MYKEY=[SECTION2]
Celà revient à splitter le fichier - split(contenu, vbcrlf) - suivit
d'un parcours du tableau et comparaison de chaque entrée avec
[section]



dans ce cas autant utiliser CFile... :O)

fichier ini.ini :
[SECTION1]
KEY=[SECTION2]

[SECTION2]
KEY=MA_VALEUR

[SECTION3]
KEY=[SECTION2]

code
'***
' Module1
Option Explicit

Private Sub Main()
Call RenameINISection("c:ini.ini", "SECTION2", "MY_NEW_SECTION")
End Sub

Private Sub RenameINISection(ByRef sFilePath As String, ByRef
sOldSection As String, ByRef sNewSection As String)

Dim f As CFile
Dim i As Long
Dim lLen As Long

If (Not FileExists(sFilePath)) Then
Call Err.Raise(53) ' File not found
Exit Sub
End If

If (Left$(sOldSection, 1) <> "[") Then sOldSection = "[" &
sOldSection If (Right$(sOldSection, 1) <> "]") Then sOldSection >> sOldSection & "]" If (Left$(sNewSection, 1) <> "[") Then
sNewSection = "[" & sNewSection If (Right$(sNewSection, 1) <>
"]") Then sNewSection = sNewSection & "]"

Set f = New CFile
lLen = Len(sOldSection)
Call f.OpenFile(sFilePath)
For i = 1 To f.LineCount
If (Left$(f.Lines(i), Len(sOldSection)) = sOldSection) Then
f.Lines(i) = Replace(f.Lines(i), sOldSection,
sNewSection) Call f.SaveFile
Exit For
End If
Next i

End Sub

Private Function FileExists(ByRef sFilePath As String) As Boolean
On Error Resume Next
FileExists = (GetAttr(sFilePath) And vbDirectory) = 0
End Function
'***

au final :
[SECTION1]
KEY=[SECTION2]

[MY_NEW_SECTION]
KEY=MA_VALEUR

[SECTION3]
KEY=[SECTION2]




Merci a tous de vos réponses. Est-ce que lire la section, la placer
dans un tableau, supprimer la section, recréé une section et
ré-écrire les clés est une façon propre.

Merci Raymond Fournier.


Avatar
Pierre Alexis [MVP]
Salut François,

Tu as écrit :

Kill IniFile



Mon Dieu !!! Depuis quand pour modifier le contenu d'un fichier on le supprime
pour le recréer :'(.
Tu perds toutes les infos de permission, les infos d'instant (date de modif,
de création), etc... Et niveau optimisation c'est vraiment pas top, vu que
cela demande beaucoup plus de travail à l'OS de recréer un fichier que de
directement aller modifier son contenu.

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
1 2