begin process at 2008 07 06 18:18:29
1 205 686 membres
251 nouveaux aujourd'hui
14 119 membres club

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 : 5 620

Note :
Aucune note

Commentaire sur cette source (9)
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.
05 avril 2008 02:28:51 :
Erreur lors de la création
05 avril 2008 10:52:14 :
Réctification
  • 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

Ajouter un commentaire

Pub



Appels d'offres

WEB DESIGN
Budget : 1 000€
Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS