Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ECRIRE OU LIRE UNE STRUCTURE DANS UN FICHIER BINAIRE


Information sur la source

Catégorie :VB.NET Source .NET ( DotNet ) Classé sous : Ecrire, Structure, Fichiers, Binaire, Marshal Niveau : Débutant Date de création : 05/04/2008 Date de mise à jour : 05/04/2008 10:52:14 Vu : 8 669

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

J'ai cherché un peu mais à ce qu'il me semble, si on souhaite enregistrer une structure dans un fichier binaire (au format .personnalisé) , la meilleur solution reste d'utiliser les méthodes Marshal.StructureToPtr et Marshal.PtrToStructure.
Vous trouverez ces méthodes dans 'imports System.Runtime.InteropServices'.

Mais il me semble aussi qu'il faut pour cela dimensionner chaque structure correctement afin que 'Marshal' sache la taille de votre structure.

Si votre structure ne contient que des valeurs fixes comme des 'integer' , 'double', 'boolean' etc, c'est bon, vous pouvez dimensionner votre structure normalement sans trop vous soucier.
Si vous utilisez des string dans vos structures, il faut les limiter à une taille fixe (voir la définition de la structure 'StruPersonne' ci-après)
 

Source

  • Imports System.Runtime.InteropServices
  • '===================================================================
  • '========= Fonctions de Lecture/Ecriture des structures ===========
  • '===================================================================
  • Private Function EcrirePerso(ByVal Perso As StruPersonne, ByVal CheminFichier As String) As Boolean
  • Dim f As New IO.FileStream(CheminFichier , IO.FileMode.OpenOrCreate)
  • Try
  • EcrirePerso = True
  • Dim vData(Marshal.SizeOf(Perso)) As Byte
  • Dim Handle As GCHandle = GCHandle.Alloc(vData, GCHandleType.Pinned)
  • Dim Pointer As IntPtr = Handle.AddrOfPinnedObject()
  • Marshal.StructureToPtr(Perso, Pointer, False)
  • Handle.Free()
  • f.Write(vData, 0, vData.Length)
  • Catch ex As Exception
  • EcrirePerso = False
  • Finally 'pour vb.net 2008 seulement, sinon débrouillez vous pour fermer le fichier! :p
  • f.Close()
  • End Try
  • End Function
  • Private Function LirePerso(ByVal CheminFichier As String) As Boolean
  • LirePerso = True
  • Try
  • Dim vData() As Byte = IO.File.ReadAllBytes(CheminFichier)
  • Dim Handle As GCHandle = GCHandle.Alloc(vData, GCHandleType.Pinned)
  • Dim Pointer As IntPtr = Handle.AddrOfPinnedObject()
  • Moi = DirectCast(Marshal.PtrToStructure(Pointer, GetType(StruPersonne)), StruPersonne)
  • Handle.Free()
  • Catch ex As Exception
  • LirePerso = False
  • End Try
  • End Function
  • '===================================================================
  • '======================= Module Structures ========================
  • '===================================================================
  • Imports System.Runtime.InteropServices
  • Public Module Structures
  • Public Structure StruPersonne
  • '-- Strings
  • '-- Besoin de dimensionner avec <MarshalAs...
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public NomMonFichier As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Nom As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Prenom As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Email As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Commentaires As String
  • 'Autres structures
  • Public Adresse As Adresse
  • Public Tel As Téléphone
  • '-- Pas besoin de dimensionner avec <MarshalAs...
  • 'Integer
  • Public ID As Integer
  • 'Boolean
  • Public IsDead As Boolean
  • End Structure
  • Public Structure Adresse
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Rue As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Ville As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
  • Public Pays As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
  • Public CodePostal As String
  • End Structure
  • Public Structure Téléphone
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
  • Public Maison As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
  • Public Portable As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
  • Public Fax As String
  • <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
  • Public Travail As String
  • End Structure
Imports System.Runtime.InteropServices

'===================================================================
'========= Fonctions de Lecture/Ecriture des structures  ===========
'===================================================================


  Private Function EcrirePerso(ByVal Perso As StruPersonne, ByVal CheminFichier As String) As Boolean

        Dim f As New IO.FileStream(CheminFichier , IO.FileMode.OpenOrCreate)
        Try
            EcrirePerso = True


            Dim vData(Marshal.SizeOf(Perso)) As Byte
            Dim Handle As GCHandle = GCHandle.Alloc(vData, GCHandleType.Pinned)
            Dim Pointer As IntPtr = Handle.AddrOfPinnedObject()
            Marshal.StructureToPtr(Perso, Pointer, False)
            Handle.Free()

            f.Write(vData, 0, vData.Length)

          
        Catch ex As Exception
            EcrirePerso = False
        Finally 'pour vb.net 2008 seulement, sinon débrouillez vous pour fermer le fichier! :p
            f.Close()
        End Try
    End Function

    Private Function LirePerso(ByVal CheminFichier As String) As Boolean
        LirePerso = True
        Try
            Dim vData() As Byte = IO.File.ReadAllBytes(CheminFichier)
            Dim Handle As GCHandle = GCHandle.Alloc(vData, GCHandleType.Pinned)
            Dim Pointer As IntPtr = Handle.AddrOfPinnedObject()
            Moi = DirectCast(Marshal.PtrToStructure(Pointer, GetType(StruPersonne)), StruPersonne)
            Handle.Free()
        Catch ex As Exception
            LirePerso = False
        End Try

    End Function



'===================================================================
'======================= Module Structures  ========================
'===================================================================


Imports System.Runtime.InteropServices
Public Module Structures
    Public Structure StruPersonne

        '-- Strings
        '-- Besoin de dimensionner avec <MarshalAs...
     
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
       Public NomMonFichier As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Nom As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Prenom As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Email As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Commentaires As String


        'Autres structures
      Public Adresse As Adresse
      Public Tel As Téléphone

     '-- Pas besoin de dimensionner avec <MarshalAs...
        
     'Integer
        Public ID As Integer

     'Boolean
        Public IsDead As Boolean
    
    End Structure

    Public Structure Adresse

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Rue As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Ville As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
        Public Pays As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
        Public CodePostal As String

    End Structure

    Public Structure Téléphone
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
        Public Maison As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
        Public Portable As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
        Public Fax As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)> _
        Public Travail As String
    End Structure

Conclusion

Tout ceci reste a confirmer, il y a peut être une façon de créer des fichiers de taille non fixe. si vous avez trouvé dites moi ca m'intéresse.
 

Historique

05 avril 2008 02:28:51 :
Erreur lors de la création
05 avril 2008 10:52:14 :
Réctification

Commentaires et avis

signaler à un administrateur
Commentaire de EBArtSoft le 05/04/2008 11:36:23 administrateur CS

Huhuh et comment ça ce passe quand c'est un tableau de "byte" a dimension fixe ?

signaler à un administrateur
Commentaire de istamkenitra le 05/04/2008 18:26:07

bon exemple..mais personnellement je trouve que c'est un peu compliqué (coté types de données)!! on peut faire mieux avec la serialization (xml ou binaire)

signaler à un administrateur
Commentaire de Galain le 05/04/2008 22:04:54

Pour répondre à EBartSoft avec un tableau de bytes et une structure à l'intérieur d'une structure

<StructLayout(LayoutKind.Sequential)> Public Structure CDROM_TOC
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim Length() As Byte
        Dim FirstTrack As Byte
        Dim LastTrack As Byte
        <MarshalAs(UnmanagedType.ByValArray, sizeConst:=100)> Dim TrackData() As TRACK_DATA
    End Structure

C'est pas de la tarte !!!! Mais faut faire avec

signaler à un administrateur
Commentaire de Picpic10 le 07/04/2008 15:13:05

Istamkenitra, aurais tu un exemple qui marche avec la serialization binaire? J'ai essaye mais rien a faire... je n'y arrive pas. Et si ca resoud le probleme de la declaration des string et rend ceci plus facile, je prends ;)

3 soirs d'essais et de recherche sur le net juste pour enregistrer une structure... C'est la seule methode que j'ai reussi a faire marcher. Mais il ne faut pas exclure que je soit just un gros boulet ^^

Ps: merci pour les commentaires et pardon pour l'absence d'accent sur le message (clavier anglais).  

signaler à un administrateur
Commentaire de linalina84 le 07/04/2008 19:42:35

je préfère qu'il soit écrit en java

signaler à un administrateur
Commentaire de istamkenitra le 08/04/2008 13:25:07

Bonjour
pour Picpic10 : un lien qui traite la serialisation binaire d'un classe :
http://plasserre.developpez.com/v5-8.htm

sinon il y en a plusieurs sur le net... avec google ..celui la est le premier que j'ai trouver ...j'espere qu'il te sera utile

signaler à un administrateur
Commentaire de Afyn le 10/04/2008 22:52:42

On avait le problème avec la structure MIDI (tu te souviens EB ?)
C'est pas simple en .NET

Yop
Afyn
Navedac
Le savoir faire des cancres du grand sud ...

signaler à un administrateur
Commentaire de EBArtSoft le 11/04/2008 23:12:45 administrateur CS

Ouai je sais qu'on avait le probleme et on l'a toujours...

signaler à un administrateur
Commentaire de Afyn le 12/04/2008 17:59:22

Et on l'a toujours ... c'est vrai

Yop

Afyn
Navedac

signaler à un administrateur
Commentaire de BarthOlivier le 12/01/2009 21:04:47

Bonjour, petite question qui n'a rien a voir, enfin en partie quand même ...

J'essaye de faire la même chose et j'ai cette erreur :

<<Le type n'a pas pu être marshalé, car la longueur d'une instance de tableau incorporée ne correspond pas à la longueur déclarée dans la disposition.>>

EN VB6 :
Public Type DATA_ACQUISITION
  Calibrage As Byte
  Voie(3) As ACQUISITION_VOIE
  Config As ACQUISITION_CONFIG
  Trig As ACQUISITION_TRIG
End Type

EN VB.NET :
  <StructLayout(LayoutKind.Sequential)> Public Structure DATA_ACQUISITION
    Dim Calibrage As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> Dim Voie() As ACQUISITION_VOIE
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)> Dim Config As ACQUISITION_CONFIG
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=7)> Dim Trig As ACQUISITION_TRIG
    '----------------------------------------------------------
    Public Sub Initialize()
      ReDim Voie(3)
    End Sub
  End Structure

Dans les structure en VB6 j'ai des byte et des long que j'ai transformé en byte et integer pour VB.NET. Visiblement ce serait la declaratation de tableau de structure (--Voie()--) qui poserai problème. Enfin je crois.

Je pensais avoir compris "en partie" la marshalisation mais alors là je suis perdu ... Si vous avez une idée

signaler à un administrateur
Commentaire de BarthOlivier le 12/01/2009 21:09:21

J'oubliais la fonction d'appel :

  Declare Function Lance Lib "USBLib" (ByVal hHandle As Integer, <MarshalAsAttribute(UnmanagedType.Struct)> ByRef pTransfer As DATA_ACQUISITION) As Integer

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

XML et VB [ par D2000 ] Salut,Je recois des fichiers XML avec une certaine structure par des clients.Je dois sauver ces infos dans une DB, mais avant, je dois valider la stru Structure fichier midi [ par miky ] Est-ce que qu'un pourrais me dire comment sont fait les fichiers midi?Afin de pouvoir reccupérer les infos des fichiers midi: auteur, titre chanson,.. Cryptage de fichiers executables [ par Clovis ] Salut! Voila mon pb, j'ai fait un logiciel de cyptage, il code bien les fichiers texte, mais quand on passe aux fichiers executables ou meme aux image fusion binaire [ par sebsoft ] est ce possible de fusionner deux fichiers en un ?si oui, comment faire pour recuperer les fichiers initiaux?mercisebsoft je veux convertir un fichiers WAV en Binaire [ par Badrou79 ] salut je veut convertir un fichier WAV en binaire pour compare a un autre Fichier qq peut m'aideé de faire ça et merci a tousBadroufun ecrire valeur binaire dans base de registre en vbs [ par quarkdown ] set wscr=CreateObject("WScript.Shell")wscr.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\properties",C0010000ff00000000000000000000000f0000003703 solution la plus rapide pour ecrire et lire un gros volume de donees [ par babas14 ] bonjour,je cherche la meilleure solution pour lire et ecrire de nombreuse donees a partir de vb ou vba puis les recuperer dans une feuille excel.j'ai Aide pour ecrire dans un fichier [ par WolfAryx ] Bonjours, J'ai créé un programme qui enregistre des données dans un fichiers text. Ces données sont sous cette forme :"Donné""DonnéB""DonnéC" Je vou Enregistrement structure dans fichier binaire en .Net [ par Djin2004 ] Bonjour,Je dispose d'une structure contenant environ 150 variables et j'aimerais savoir s'il est possible en VB.net de l'enregistrer en une seule fois Ecrire en binaire [ par gorby69 ] Salut,J'aimerais écrire un fichier en binaire mais pas avec la commande classique:open fichier for binary write as #1mais en vrai binaire, avec des 0


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.