Taille du buffer permettant de lire une section complete dans un fichier INI :-s
youkizouki
Messages postés82Date d'inscriptionjeudi 22 avril 2004StatutMembreDernière intervention12 octobre 2005
-
28 févr. 2005 à 15:10
youkizouki
Messages postés82Date d'inscriptionjeudi 22 avril 2004StatutMembreDernière intervention12 octobre 2005
-
1 mars 2005 à 17:34
salut,
j'ai du pour le paramétrage de mon applic utiliser un fichier INI... le premier probleme qui se posait était que le contenu de mon fichier devait etre entièrement dynamique (je dois permettre d'ajouter d'eventuels nouveaux parametres pour le fonctionnement futur de mon applic) j'ai heureusement trouvé sur ce site la manière de lire des section complète d'un fichier grace a l'API getPrivateProfileSection (je tiens d'ailleur à remercier "DeadlyPredator" pour l'aide qu'il m'a apporté)
voici la procédure qui appelle cet API :
'stock dans un tableau toutes les clés d'une section sous la forme "clé=valeur"
Public Function lireCleSection(ByVal strINIFile As String, ByVal strSection As String) As String()
Dim strBuf As String
Dim col() As String
Dim col2() As String
Dim i As Long
Dim lngRet As Long
Dim j As Integer 'pour redimensionner Col2
j = 0
strBuf = Space(1500) 'chaîne constituée de 1500 blanc (buffer qui va contenir toutes les
'valeurs de la section ) 'PROBLEME
'cette API initialise la chaine strBuff avec "nom clé=valeur" de la section strSection
'et retourne la taille de la chaine strBuf
lngRet = GetPrivateProfileSection(strSection, strBuf, Len(strBuf), strINIFile)
MsgBox "valeur de lngRet dans lireCleSection : " & lngRet
If lngRet <> 0 Then 'si il il a une valeur retournée
strBuf = Left$(strBuf, lngRet) 'suppression des blanc inutiles
Else
ReDim col2(1) 'si il n'y a pas de valeur dans la section
col2(1) = ""
lireCleSection = col2
Exit Function
End If
'col est un tableau a 1 dimension contenant sur chaque ligne : nom_clé=valeur
col = Split(strBuf, vbNullChar)
For i = 0 To UBound(col) - 1
If Len(Trim$(col(i))) <> 0 Then 'If Trim$(col(I)) <> Empty Then 'si ce n'est pas une ligne vide
j = j + 1
ReDim Preserve col2(j)
col2(i) = col(i)
End If
Next
lireCleSection = col2
End Function
mon probleme est que pour utiliser l'API je dois déclarer une chaine et l'initialiser avec suffisament de blancs pour stocker le resultat. (voir PROBLEME) mais le contenu de mon fichier INI est dynamique et donc si je rajoute enormement de valeur a une section il se peut qu'un jour, la taille de ma chaine qui va contenir la repons (strBuf) soit trop petit -> DEBUG VB !
savez vous comment pourrais je m'y prendre pour redimensionner la taille de la chaine en focntion du nombre de valeur que contient une section de mon fichier INI ?
Merci d'avance pour votre attention...
mika
A voir également:
Taille du buffer permettant de lire une section complete dans un fichier INI :-s
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 28 févr. 2005 à 19:13
Je suis d'accord avec toi, space(1500) ça risque d'etre un peu court assez rapidement.
J'ai eu le même souci que toi l'autre jour, à la différence que mes
données ne sont formatées clé=valeur, mais simplement
valeur1;valeur2;...... Donc lecture/ecriture uniquement par section.
Moi j'ai mis space(500 000) pour etre tranquille.
Je ne sais pas comment on obtient la taille d'une section, je pense
même que ce n'est pas possible ou alors avec une API non documentée
peut etre.
J'ai vu un exemple de code 'professionnel' ou ils géraient ce problème,
mais cétait une véritable usine à gaz, c'est pour cela que je l'ai pas
retenu.
Enfin 500000 octets, ça fait 10000 lignes de 50 octets je crois qu'il y a de quoi voir venir.
<hr size="2" width="100%">Si le cerveau était assez simple pour que nous puissions le comprendre,
nous serions assez bête pour ne pas le comprendre malgré tout.