[.net] i/o type/structure (compatibilité vb6)

Contenu du snippet

Ok le titre n'est pas tres explicite, j'explique :

Pour ceux qui travail avec les fichiers en VB.NET il est devenue assez complexe de lire et d'ecrire dans les fichiers des Structures predefinis (en VB6 il suffisait de definir son Type puis d'utiliser Put # et Get #) alors j'ai cherché pendant un bon moment pour trouver la solution idéal. Faute d'avoir trouvé l'idéal... voici la methode la plus efficace pour le moment dont je vous livre le contenue :

( 1 ) - Premierement transcrire la structure en syntaxe VB.NET (petit rappel)

- - Dim I As Long => Dim I As Int
- - Dim I As Integer => Dim I As Short
- - Etc...
- - Dim I As String * 8 =>
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> _
Dim I As String

- - Dim I(7) As Byte =>
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _
Dim I() As Byte
Sub New(ByVal e)
ReDim Test2(8-1)
End Sub

( 2 ) - Ajouter les fonctions ByteToStruct(Typé) & StructToByte
- - Modifier chaque fonction ByteToStruct pour accepter le type voulue

( 3 ) - Lire et/ou ecrire avec un FileStream standard
- - Une fois que l'on a converti la structure en tableau d'octet on peut
- - lire et ecrire a volonté...

Source / Exemple :


Option Explicit On 

Imports System.Runtime.InteropServices

    Private Structure TYPETEST
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> _
        Dim Test1 As String
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _
        Dim Test2() As Byte
        Sub New(ByVal e)
            ReDim Test2(7)
        End Sub
    End Structure

    Private Function ByteToStruct(ByRef Data() As Byte) As Object
        Dim Handle As GCHandle = GCHandle.Alloc(Data, GCHandleType.Pinned)
        Dim Pointer As IntPtr = Handle.AddrOfPinnedObject()
        ByteToStruct = DirectCast(Marshal.PtrToStructure(Pointer, GetType(TYPETEST)), TYPETEST)
        Handle.Free()
    End Function

    Private Function StructToByte(ByRef Obj As Object) As Byte()
        Dim Data(Marshal.SizeOf(Obj)) As Byte
        Dim Handle As GCHandle = GCHandle.Alloc(Data, GCHandleType.Pinned)
        Dim Pointer As IntPtr = Handle.AddrOfPinnedObject()
        Marshal.StructureToPtr(Obj, Pointer, False)
        Handle.Free()
        Return Data
    End Function

   Private Sub OnWrite()
        Dim vTest As New TYPETEST(0)
        Dim vData() As Byte
        With New IO.FileStream("Test.txt", IO.FileMode.OpenOrCreate)
            vTest.Test1 = "Manu"
            vData = StructToByte(vTest)
            .Write(vData, 0, vData.Length)
            .Close()
        End With
    End Sub

    Private Sub OnRead()
        Dim vTest As New TYPETEST(0)
        Dim vData() As Byte
        With New IO.FileStream("Test.txt", IO.FileMode.Open)
            .Read(vData, 0, vData.Length)
            vTest = ByteToStruct(vData)
            .Close()
        End With
    End Sub

Conclusion :


Voila c'est une methode farfelu pour pas grand chose si qlq1 a une solution plus radicale pour lire et ecrire des structures avec des chaine/tableau de longueur fixe merci de partagé votre savoir ;)

Le petit plus c'est biensur la methode de copie de données brut qui marche avec n'importe quel objet, tableau ou variable dont je ferais peut etre un autre exemple plus tard

B@nne prog

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.