kiboumz
Messages postés120Date d'inscriptionmercredi 17 septembre 2003StatutMembreDernière intervention18 mai 2007
-
10 août 2006 à 14:52
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018
-
31 mai 2012 à 19:46
Bonjour,
J'ai un fichier qui a été crée à accès binaire (direct) à l'aide d'une structure, et j'ai besoin de lire ce fichier, mais j'ai n'ai pas accès à la structure.
Y-a-t'il un moyen de savoir comment était fait cette structure ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 28 janv. 2008 à 15:32
J'ai fini par trouvé une solution (Je ne l'es trouvé nul part donc je diffuse le même post un peut partout, ou le sujet semble être lié au problème que j'ai rencontré quand même)
Attention ça ne fonctionneras pas dans tout les cas, à moins de l'adapter à mort...
La déclaration de chaine de longueur fixe (qui ne fonctionne que dans le cas ci-dessous, tout du moins dans mes test) :
Il faut cette déclaration dans une structure simple (soit dans une structure ne contenant pas d'autre structure)
Mon objectif été de lire dans un fichier binaire des données écrite
avec la méthode put de VB6 et de les chargé dans une structure complexe
(j'entends par là contenant d'autre structures)
Méthode :
1) Déclaration de mes structures et variables comme d'habitude
2) Déclaration de nouvelle structure simple basé sur le même schéma que les structure complexe mais sans les sous structures
3) Lecture du fichier en placent les données dans un tableau de byte (mentionnés pour contenir le bon nombre de données)
4) Copie des données grâce à CopyMemory (ou sans doute marchal.copy
mais je n'es pas fait de test avec, donc à valider) dans les structures
simples.
5) Copie des structure simple dans les structure complexe.
Bon je suis conscient que ça peut paraitre obscure je mes donc un exemple.
8<----------------------------------------------------------------------------------------------------
Private Declare Sub CopyMemory Lib "kernel32" Alias
"RtlMoveMemory" (ByRef Destination As S_Simple, ByRef Source As Byte,
ByVal Length As Int16)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(ByRef Destination As S_Creation, ByRef Source As Byte, ByVal Length As
Int16)
TailleTotalDeLaStructure = TailleRacine + (TailleNiveau1 * C_NbSousStrucutre) 'Sauvegarde de la taille de la structure
Dim Tampon(0 To TailleTotalDeLaStructure - 1) As Byte 'Le
tampon ou les données vont être placé à la lecture (-1 car le tableau
commence à 0 et non pas à 1)
Compteur = 0 'Init du compteur si non le complo renvoie un Warning
StreamFichier = New System.IO.FileStream(ChemainNomFichier,
System.IO.FileMode.Open, IO.FileAccess.Read) 'L'ouverture du fichier
NombreDeStructure = StreamFichier.Length /
TailleTotalDeLaStructure 'Sauvegarde du nombre de structure à priorie
présente dans le fichier
ReDim DonneesFichier(0 To NombreDeStructure - 1) 'Création du tableau de structure servant à recevoir les données
While Compteur < NombreDeStructure 'Temps que toute les structure n'ont pas été lut
Try 'Gestion d'erreur
Dim Position As UInt16
StreamFichier.Read(Tampon, 0, TailleTotalDeLaStructure) 'Lit les données et les met dans le tampon
CopyMemory(ConstruitRacine, Tampon(0), TailleRacine) 'Copie des données du tampon dans la structure
For CompteurMaj As UInt16 = 0 To C_NbSousStrucutre - 1
CopyMemory(ConstruitNiveau1(CompteurMaj),
Tampon(TailleRacine + TailleNiveau1 * CompteurMaj), TailleNiveau1)
'Copie des données du tampon dans la structure
Si la sous structure avais par exemple été entre "Chaine" et "Valeur" il aurais fallut ajouté encore une étape à la lecture.
1) CopyMemory de "Chaine"
2) CopyMemory des sous structure
3) CopyMemory de "Valeur"
(et sans doute une variable qui sauvegarde la position courante dans le tampon)
Voila j'espère avoir été claire. Mais franchement sur ce coup Microbof ne cherche vraiment pas à nous arrangé.
ATTENTION : Je parle ici de lecture d'un fichier binaire qui aurais été
crée et/ou encore utilisé par d'autre programme si non il existe des
méthode "BinaryFormatter.Serialize" et "BinaryFormatter.Deserialize"
simple à utilisé mais qui insère une entête de fichier contenant le
type et la version de ce qui à été sauvegarder. Il n'est donc pas
possible de lire avec ces méthode si l'entête est absent. De plus le
développeur n'a plus complètement les main libre sur la façon dont ses
données seront sauvegarder.
malaklari
Messages postés6Date d'inscriptionsamedi 10 mars 2012StatutMembreDernière intervention31 mai 2012 31 mai 2012 à 18:57
slt je travaille sous vb6 j ai creer un fichier à l aide d une structure.et j ai un tableau de cette structure mais je ne sais pas comment faire afin de stocké ce tableau dans mon fichier sachant que c est un fichier à acces directe.
svp j ai vraiment besoin de votre aide merciiii
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018220 31 mai 2012 à 19:46
ouvre donc ta propre discussion, d'autant qu_e tu dévemloppes spous VB6 et que la présente discussion concerne VB.Net !
Prends soin d'apporter les précisions nécessaires avec plus de clarté !
Montre la structure, comment elle a été déclarée et utilisée pour écrire ton fichier (pas ici, hein ===W>> dans la discussion que tu ouvriras).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ