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

Meilleur moyen pour sauver mes données ????

8 réponses
Avatar
Pmp
Hello !

Dans une application, j'ai un tableau qui stocke des chemin de répertoires
(qui seront utilisés pour faire des recherche de fichiers).
Je souhaite sauvegarder ce tableau dans une fichier.

Par contre !!!

Je ne veux pas avoir 50 000 fichiers des données à droite et à gauche.

Actuellement, j'inscris tout cela dans un fichier .ini avec
Clé = Chemin du répertoire
Valeur de la clé = "true" (ou n'importe quoi, d'ailleurs...)
avec l'API Writeprofilestring

Puis, pour la lecture, je découpe sauvagement le fichier pour retrouver les
clés de la section..
(mais ce n'est pas très *smart* , plutôt boucher...)

Si quelqu'un a un moyen (ou une idée) plus zolie pour faire cela, j'en
serais ravi...

Merci d'avance !!!

--
----------------------------
Pmp
PmNews@plet.org
Enlevez le ANTIPUB en cas de Reply-to
(Saleté de SPAM !!!)
----------------------------

8 réponses

Avatar
François Picalausa
Bonjour/soir,

"Zoury" a écrit dans le message de
news:
Private Function GetPrivateProfileString _
( _
ByRef sSection As String, _
ByRef sKey As String, _
ByRef sDefault As String, _
ByRef sFileName As String _
) As String
GetPrivateProfileString = String$(255, Chr$(0))
Call GetPrivateProfileStringA(sSection, sKey, sDefault,
GetPrivateProfileString, 255, sFileName)
End Function



Pour tes 5 fichiers, les 255 caractères ne sont pas vite atteints lors de la
relecture...
Mais pour 30 ou 40, il y a peut-être un petit problème...
Des chemins comme ceux que tu as données représentent à peu près 10
caractères en moyenne.
10*30 = 300... 5 en trop si on ne compte pas les séparateurs ;-)

Voici un bout de code permettant de ne pas être limité aux 255 caractères:
'Dans un module
Private Declare Function GetPrivateProfileString _
Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String _
) _
As Long

Public Function GetIniEntry _
( _
FileName As String, _
Section As String, _
Key As String, _
Optional DefaultValue As String = "" _
) _
As String

Dim ReturnCode As Long, bContinue As Boolean, buffersize As Long

bContinue = True
buffersize = 255

Do While bContinue
GetIniEntry = String$(buffersize, vbNullChar)
ReturnCode = GetPrivateProfileString( _
Section, _
Key, _
DefaultValue, _
GetIniEntry, _
buffersize, _
FileName _
)

'The return value is the number of characters copied to the buffer,
' not including the terminating null character.
'
'If neither lpAppName nor lpKeyName is NULL
' and the supplied destination buffer is too small
' to hold the requested string, the string is truncated
' and followed by a null character,
' and the return value is equal to nSize minus one.

If ReturnCode = buffersize - 1 _
And Right(GetIniEntry, 1) = vbNullChar Then 'buffer trop court

buffersize = buffersize + 255 'incrémente par pas de 255
Else
GetIniEntry = Left$(GetIniEntry, ReturnCode)
bContinue = False
End If
Loop
End Function


--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
Pmp
Je n'aurais qu'un mot à dire : Merci et bravo.

J'ai là la réponse à mon besoin !
nickel....

Pour Zoury : effectivement, j'utilise les API Write et
GetPrivateProfileString, mais j'étais limité à 255 caractères.. (Les
C:Documents & SettingsAdministrateur etc... font vite des chaines
importantes !!!).

Le reste des infos stockés dans mon ini sont d'une banalité déconcertante
(True / false la plupart du temps.. ce qui correspond aux choix de
configuration), et ça m'ennuyait un peu de créer un nouveau fichier juste
pour cela...
L'astuce du "buffer extensible" me convient tout à fait.

Juste une dernière question (c'est vraiment histoire d'être pointilleux...)
: Y a t-il une limite de taille (raisonnable.. si c'est 2.10^25 caractères,
c'est bon...) à cette chaine ? (quoique.. je peux faire une petite routine
qui teste cela...) ?

Merci encore !

----------------------------
Pmp

Enlevez le ANTIPUB en cas de Reply-to
(Saleté de SPAM !!!)
----------------------------
"François Picalausa" a écrit dans le message de news:
O9#
Bonjour/soir,

"Zoury" a écrit dans le message de
news:
> Private Function GetPrivateProfileString _
> ( _
> ByRef sSection As String, _
> ByRef sKey As String, _
> ByRef sDefault As String, _
> ByRef sFileName As String _
> ) As String
> GetPrivateProfileString = String$(255, Chr$(0))
> Call GetPrivateProfileStringA(sSection, sKey, sDefault,
> GetPrivateProfileString, 255, sFileName)
> End Function

Pour tes 5 fichiers, les 255 caractères ne sont pas vite atteints lors de


la
relecture...
Mais pour 30 ou 40, il y a peut-être un petit problème...
Des chemins comme ceux que tu as données représentent à peu près 10
caractères en moyenne.
10*30 = 300... 5 en trop si on ne compte pas les séparateurs ;-)

Voici un bout de code permettant de ne pas être limité aux 255 caractères:
'Dans un module
Private Declare Function GetPrivateProfileString _
Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String _
) _
As Long

Public Function GetIniEntry _
( _
FileName As String, _
Section As String, _
Key As String, _
Optional DefaultValue As String = "" _
) _
As String

Dim ReturnCode As Long, bContinue As Boolean, buffersize As Long

bContinue = True
buffersize = 255

Do While bContinue
GetIniEntry = String$(buffersize, vbNullChar)
ReturnCode = GetPrivateProfileString( _
Section, _
Key, _
DefaultValue, _
GetIniEntry, _
buffersize, _
FileName _
)

'The return value is the number of characters copied to the


buffer,
' not including the terminating null character.
'
'If neither lpAppName nor lpKeyName is NULL
' and the supplied destination buffer is too small
' to hold the requested string, the string is truncated
' and followed by a null character,
' and the return value is equal to nSize minus one.

If ReturnCode = buffersize - 1 _
And Right(GetIniEntry, 1) = vbNullChar Then 'buffer trop court

buffersize = buffersize + 255 'incrémente par pas de 255
Else
GetIniEntry = Left$(GetIniEntry, ReturnCode)
bContinue = False
End If
Loop
End Function


--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
Zoury
La taille limite d'un chaine de caractère varie selon son type.

une chaine variable peut prendre jusqu'à environ 2 milliards (2 ^ 31) de
caractères.
une chaine fixe peut prendre de 1 à près de 64 000 (2 ^ 16) caractères.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"Pmp" wrote in message
news:bj885v$sd6$
Je n'aurais qu'un mot à dire : Merci et bravo.

J'ai là la réponse à mon besoin !
nickel....

Pour Zoury : effectivement, j'utilise les API Write et
GetPrivateProfileString, mais j'étais limité à 255 caractères.. (Les
C:Documents & SettingsAdministrateur etc... font vite des chaines
importantes !!!).

Le reste des infos stockés dans mon ini sont d'une banalité déconcertante
(True / false la plupart du temps.. ce qui correspond aux choix de
configuration), et ça m'ennuyait un peu de créer un nouveau fichier juste
pour cela...
L'astuce du "buffer extensible" me convient tout à fait.

Juste une dernière question (c'est vraiment histoire d'être


pointilleux...)
: Y a t-il une limite de taille (raisonnable.. si c'est 2.10^25


caractères,
c'est bon...) à cette chaine ? (quoique.. je peux faire une petite routine
qui teste cela...) ?

Merci encore !

----------------------------
Pmp

Enlevez le ANTIPUB en cas de Reply-to
(Saleté de SPAM !!!)
----------------------------
"François Picalausa" a écrit dans le message de


news:
O9#
> Bonjour/soir,
>
> "Zoury" a écrit dans le message de
> news:
> > Private Function GetPrivateProfileString _
> > ( _
> > ByRef sSection As String, _
> > ByRef sKey As String, _
> > ByRef sDefault As String, _
> > ByRef sFileName As String _
> > ) As String
> > GetPrivateProfileString = String$(255, Chr$(0))
> > Call GetPrivateProfileStringA(sSection, sKey, sDefault,
> > GetPrivateProfileString, 255, sFileName)
> > End Function
>
> Pour tes 5 fichiers, les 255 caractères ne sont pas vite atteints lors


de
la
> relecture...
> Mais pour 30 ou 40, il y a peut-être un petit problème...
> Des chemins comme ceux que tu as données représentent à peu près 10
> caractères en moyenne.
> 10*30 = 300... 5 en trop si on ne compte pas les séparateurs ;-)
>
> Voici un bout de code permettant de ne pas être limité aux 255


caractères:
> 'Dans un module
> Private Declare Function GetPrivateProfileString _
> Lib "kernel32" _
> Alias "GetPrivateProfileStringA" _
> ( _
> ByVal lpApplicationName As String, _
> ByVal lpKeyName As String, _
> ByVal lpDefault As String, _
> ByVal lpReturnedString As String, _
> ByVal nSize As Long, _
> ByVal lpFileName As String _
> ) _
> As Long
>
> Public Function GetIniEntry _
> ( _
> FileName As String, _
> Section As String, _
> Key As String, _
> Optional DefaultValue As String = "" _
> ) _
> As String
>
> Dim ReturnCode As Long, bContinue As Boolean, buffersize As Long
>
> bContinue = True
> buffersize = 255
>
> Do While bContinue
> GetIniEntry = String$(buffersize, vbNullChar)
> ReturnCode = GetPrivateProfileString( _
> Section, _
> Key, _
> DefaultValue, _
> GetIniEntry, _
> buffersize, _
> FileName _
> )
>
> 'The return value is the number of characters copied to the
buffer,
> ' not including the terminating null character.
> '
> 'If neither lpAppName nor lpKeyName is NULL
> ' and the supplied destination buffer is too small
> ' to hold the requested string, the string is truncated
> ' and followed by a null character,
> ' and the return value is equal to nSize minus one.
>
> If ReturnCode = buffersize - 1 _
> And Right(GetIniEntry, 1) = vbNullChar Then 'buffer trop


court
>
> buffersize = buffersize + 255 'incrémente par pas de 255
> Else
> GetIniEntry = Left$(GetIniEntry, ReturnCode)
> bContinue = False
> End If
> Loop
> End Function
>
>
> --
> François Picalausa (MVP VB)
> FAQ VB : http://faq.vb.free.fr
> MSDN : http://msdn.microsoft.com
>
>




Avatar
François Picalausa
Bonjour/soir,

On pourrait également sotckée la longueur totale dans une autre clé. :OP



Selon le principe qu'il ne faut jamais faire confiance à une entrée
utilisateur et sachant que l'utilisateur peut éditer le fichier ini, je
dirais que non, on ne peut pas...
Mais tout dépend du fait qu'on puisse avoir confiance en les utilisateurs et
du fait que les utilisateurs soient prévenus... (ici, pour un groupe
restreint d'uilisateurs, ça pourrait aller)

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com

"Zoury" a écrit dans le message de
news:
Tiens c'est vrai! :O)

On pourrait également sotckée la longueur totale dans une autre clé. :OP


Avatar
Pmp
Cela devrait amplement me suffire..
Même en lisant 1 ligne par seconde (ligne de 50 caractères), cela représente
1,4 an de lecture, ce qui en soi est suffisant..

Merci à vous deux !!

--
----------------------------
Pmp

Enlevez le ANTIPUB en cas de Reply-to
(Saleté de SPAM !!!)
----------------------------
Avatar
Zoury
Avatar
Pmp
> C'est aussi un fait.
dans ce cas-ci il le logiciel est pour lui, alors s'il y a des problèmes


il
saura qui en est la cause.. :O)



Bien sûr !! ce sera l'ordinateur...

--
----------------------------
Pmp

Enlevez le ANTIPUB en cas de Reply-to
(Saleté de SPAM !!!)
----------------------------


--
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/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
Zoury
J'ajouterais même que seule une base de données offre une protection contre
les modifications éventuelles d'utilisateur trop curieux... On ne sera
*jamais* en sureté avec un .ini/.txt ou même avec la base de registre. Alors
dans cette optique, j'opterais quand même pour cette technique, sachant que
la modificaiton de cette clé ou une autre ne fera pas grand différence...
S'il modifie le fichier et que sa lecture en devient impossible, on devra
tout de même le détruire et le recréer avec des valeurs par défauts.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"François Picalausa" wrote in message
news:
Bonjour/soir,

> On pourrait également sotckée la longueur totale dans une autre clé. :OP

Selon le principe qu'il ne faut jamais faire confiance à une entrée
utilisateur et sachant que l'utilisateur peut éditer le fichier ini, je
dirais que non, on ne peut pas...
Mais tout dépend du fait qu'on puisse avoir confiance en les utilisateurs


et
du fait que les utilisateurs soient prévenus... (ici, pour un groupe
restreint d'uilisateurs, ça pourrait aller)

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com

"Zoury" a écrit dans le message de
news:
> Tiens c'est vrai! :O)
>
> On pourrait également sotckée la longueur totale dans une autre clé. :OP