Lire fichier à accès direct

Signaler
Messages postés
120
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
18 mai 2007
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
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 ?

Merci
a+

4 réponses

Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
14
Salut,


Bhà ma foi si ce n'est pas un truc standardiser ou normaliser (selon le point de vue) ça va être dur.



Chris...


Web :
Firstruner
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

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)

8<----------------------------------------------------------------------------------------------------
<VBFixedString(LG_DU_TEXT),
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,
SizeConst:=LG_DU_TEXT)> _

Dim Chaine() as Char


---------------------------------------------------------------------------------------------------->8


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)


    Private Const C_NbSousStrucutre = 10

    Private Const C_TailleChaine = 10


    'Déclaration des structures

    Private Structure S_Simple

        <VBFixedString(C_TailleChaine),
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,
SizeConst:=C_TailleChaine)> _

        Public SousChaine() As Char

        Public SousValeur As Int16

    End Structure


    Private Structure S_Objectif

        <VBFixedString(C_TailleChaine),
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,
SizeConst:=C_TailleChaine)> _

        Public Chaine() As Char

        Public Valeur As Int16

        Public SousDonnees() As S_Simple

        Public Sub Initialise()

            ReDim SousDonnees(0 To C_NbSousStrucutre - 1)

        End Sub

    End Structure


    'Structure basé sur le même schema que S_Objectif mais sans le tableau de sous structure

    Private Structure S_Creation

        <VBFixedString(C_TailleChaine),
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,
SizeConst:=C_TailleChaine)> _

        Public Chaine() As Char

        Public Valeur As Int16

        'Public SousDonnees() As S_Simple

        'Public Sub Initialise()

        '    ReDim SousDonnees(0 To C_NbSousStrucutre - 1)

        'End Sub

    End Structure


    'Fonction de lecture

    Public Function LitFichier(ByVal ChemainNomFichier As String, ByRef DonneesFichier() As S_Objectif) As Boolean

        Dim Compteur As UInt16 'Compteur utilisé pour remplire le tableau de structure

        Dim NombreDeStructure As UInt16 'Varable utilisé pour stocké le nombre de structure à extraire

        Dim StreamFichier As System.IO.FileStream 'Streameur fichier (ce qui permet de lire le fichier)

        Dim TailleRacine As UInt16

        Dim TailleNiveau1 As UInt16

        Dim TailleTotalDeLaStructure As UInt16 'Variable utilisé pour stocké la taille de la structure

        Dim ConstruitRacine As S_Creation

        Dim ConstruitNiveau1() As S_Simple

        ReDim ConstruitNiveau1(0 To C_NbSousStrucutre - 1)

        TailleRacine = System.Runtime.InteropServices.Marshal.SizeOf(ConstruitRacine)

        TailleNiveau1 = System.Runtime.InteropServices.Marshal.SizeOf(ConstruitNiveau1(0))

        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

                Next

                DonneesFichier(Compteur).Initialise()

                DonneesFichier(Compteur).Chaine = ConstruitRacine.Chaine

                DonneesFichier(Compteur).Valeur = ConstruitRacine.Valeur

                DonneesFichier(Compteur).SousDonnees = ConstruitNiveau1


                Compteur = Compteur + 1 'Incrémentation du compteur de boucle

            Catch ex As Exception 'Si une erreur se déclenche dans le block Try Catch

                StreamFichier.Close() 'Ferme le fichier

                Return False 'Retourne faux

                Exit Function 'Quite la fonction

            End Try 'Fin de la gestion d'erreur

        End While 'Fin de la boucle

        StreamFichier.Close() 'Ferme le fichier

        Return True 'Retourne Vrais (sous entendu tout c'est passé correctement)

    End Function


---------------------------------------------------------------------------------------------------->8


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.

Amicalement
Pensez "Réponse acceptée"

Amicalement
Pensez "Réponse acceptée"
Messages postés
6
Date d'inscription
samedi 10 mars 2012
Statut
Membre
Dernière intervention
31 mai 2012

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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
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