begin process at 2012 02 16 11:08:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VB.NET

 > ECRIRE OU LIRE UNE STRUCTURE DANS UN FICHIER BINAIRE

ECRIRE OU LIRE UNE STRUCTURE DANS UN FICHIER BINAIRE


 Information sur la source

Note :
Aucune note
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 :11 528

Auteur : Picpic10

Ecrire un message privé
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

 Sources de la même categorie

Source .NET (Dotnet) MODIFICATION DATE DE WINDOWS EN VB.NET ET VBA par us_30
Source avec Zip Source avec une capture Source .NET (Dotnet) ENVOI DE MAIL AVEC PIÈCE JOINTE par EhJoe
Source .NET (Dotnet) AMUSONS NOUS AVEC UN LABEL ^^ par Adn56
Source avec Zip Source avec une capture Source .NET (Dotnet) UN NAVIGATEUR INTERNET EN VB.NET par azrti
Source avec Zip Source .NET (Dotnet) CONVERSION DE DEVISE MONAITAIRE VIA UN SERVICE WEB par bigmonkey7

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture RECHERCHE & SAUVEGARDE DES FICHIERS PAR LEURS EXTENSIONS par hackoo
Source avec Zip Source avec une capture FILE2COMPARE: COMPARAISON DE DEUX FICHIERS LIGNE PAR LIGNE par hackoo
Source avec Zip Source .NET (Dotnet) SÉRIALISATION/DÉSÉRIALISATION BINAIRE D'UNE CLASSE par _Fabien
Source .NET (Dotnet) SERIALISATION/DESERIALISATION D'UNE STRUCTURE par _Fabien
LIRE/ECRIRE DANS DES CHAMPS BINAIRES par FlyKiller

Commentaires et avis

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 ?

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)

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

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).  

Commentaire de linalina84 le 07/04/2008 19:42:35

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

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

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

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

Commentaire de Afyn le 12/04/2008 17:59:22

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

Yop

Afyn
Navedac

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

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

Ecrire dans un fichier binaire de plus de 2 Go [ par youyou40 ] Bonjour J'écris une petite application qui travaille sur des fichiers pouvant être très gros. J'utilise l'instruction Put pour écrire dans ces fichier Ecrire des fichiers binaires de plus de 2Go [ par cuzco38 ] Bonjour,j'ai un programme qui genere des gros fichiers binpour ecrire le fichier j'utiliseOpen "monfichier" For Binary As #1Put #1, , byte_aray()Close 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 Gros Rallentissement [ par MaxSoldier ] Encore moi ! D&#233;sol&#233;, j'ai beaucoup de probl&#232;mes en ce moment :-p Voil&#224; ma source : http://maxgaudin.free.fr/SourceExtractor.txt STRUCTURE DE FICHIERS [ par DHN93160 ] AU SECOURS! HELP! J'AI CREE 5 TABLES AVEC ACCESS AVEC UNE MEME LONGUEUR DE 240 CARACTERES. JE VOULAIS LE CONVERTIR EN FICHIER TXT ET LES REGROUPER EN fichier binaire [ par taghzou ] salut tous le monde, j'ai un fichier binaire ,mais le probleme j ai pas la structure utilis&#233; comment faire pour generer la structure pour pouvoir [vb.net]Fichier binaire et structure [ par spycko ] Salutj'ai cr&#233;er une structure (T_FILEHST) qui corespont &#224; la strucure de mon fichier binaireet je voudrez mettre le contenu de mon fichier d Structure d'un fichier binaire? [ par pinje ] Bonjour a tous,J'aimerais lire un fichier binaire contenant les resultats d'un calcul, or je ne connais pas a l'avance sa structure... Est ce qu'il es Structure Reiserfs Linux [ par Galain ] bonjour à tousJe programme en Visual Basic 6.0 et je recherche des informations sur le système de fichiers Reiserfs de Linux afin de rajouter à mon pr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales