Accés binaire aux fichiers (ecriture,lecture). 4 petits exemples simples en vb.net


Contenu du snippet

Tout ceci est plus ou moins resultat de tatonements. Il y a encore qq trucs qui restent ambigue pour moi aussi, comme le flush, est il necessaire de le faire à chaque fois si on ferme l'objet....
Il y a d'autres moyens encore, je sais, et j'y reviendrais surement. mais il n'y à rien la dessus ici pour l'instant (sauf un exemple d'ecriture de texte...) .
Touts les commentaires sont les bienvenus, mais si ils peuvent etre contructifs, c'est encore mieux.

Source / Exemple :


Imports System.IO 'à mettre en tout debut de votre code

'un exemple tout bidon, une copie de fichier grace a un tableau

    Private Sub copyfile(ByVal chemin1 As String, ByVal chemin2 As String)
        Dim hbread As New BinaryReader(File.OpenRead(chemin1)) 'on defini hbread comme BinaryReader, auquel on doit specifier le mode d'ouverture (File.OpenRead) et le chemin du fichier
        Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin2)) 'on defini hbwrite comme BinaryWriter, auquel on doit specifier le mode d'ouverture (File.OpenWrite) et le chemin du fichier
        Dim F_array(FileLen(chemin1) - 1) As Byte 'on defini un tableau dont le nbre de cellules est egale a la taille du fichier - 1. -1 car on utilise dans le tableau, l'index 0, que l'on pourra considerer comme l'offset.(l'offset 0x00000000 sera donc dans F_array(0),0x0000000A sera dans F_array(10) etc...)
        Dim i As Integer

        hbread.BaseStream.Seek(0, SeekOrigin.Begin)  'defini le pointeur de lecture au debut du fichier (offset 0x00000000, à partir du debut du fichier)

'SeekOrigin defini a partir de ou il doit compter l'offset, on a le choix entre Begin, ous avez compris, End, à la fin du fichier, et Current, la position actuelle du curseur

        hbread.Read(F_array, 0, FileLen(chemin1)) 'on lit le fichier octet par octet que l'on stocke dans le tableau, on specifie ensuite à partir de quel index du tableau on va copier les fichiers (0), et le nbre d'octets que l'on veux (l'equivalent donc ici, de la taille du fichier)
        hbwrite.BaseStream.Seek(0, SeekOrigin.Begin) 'defini le pointeur d'ecriture au debut du fichier
        hbwrite.Write(F_array, 0, FileLen(chemin1)) 'on ecrit le contenu de F_array dans le fichier ouvert en ecriture, vu que l'on veux ecrire tout le tableau, il n'etait pas obligé de specifier l'index de depart et le nbre d'octets.
        hbread.BaseStream.Flush() 'on libere le buffer
        hbwrite.BaseStream.Flush() 'on libere le buffer
        hbwrite.Flush() 'on libere le buffer
        hbread.Close() 'on ferme l'objet
        hbwrite.Close() 'on ferme l'objet
    End Sub

    'les valeurs utilisées sont toutes "fictives", c'est juste pour l'exemple écrit, et cela ne correspond à aucune modification speciale de fichiers que j'aurais pu faire :

    'voila ca c'est la 1ere methode que j'utilisais pour la modification de fichier
    'Ce n'est pas tres propre car je lis le fichier entier à chaque fois, et je le réecris aussi donc entierement
    'ce pourtant pour n'acceder qu'à quelques octets, mais cela rend l'accés plus simple (enfin un peu plus clair...)

    Private Sub modifyfile1(ByVal chemin As String)

        Dim hbread As New BinaryReader(File.OpenRead(chemin))
        Dim F_array(FileLen(chemin) - 1) As Byte
        hbread.BaseStream.Seek(0, SeekOrigin.Begin)  'defini le pointeur de lecture au debut du fichier
        hbread.BaseStream.Read(F_array, 0, FileLen(chemin)) 'on lit le fichier octet par octet que l'on stocke dans le tableau, on specifie ensuite à partir de quel index du tableau on va copier les fichiers (0), et le nbre d'octets que l'on veux (l'equivalent donc ici, de la taille du fichier)
        hbread.BaseStream.Flush() 'on libere le buffer
        hbread.Close()

        F_array(10) = &HFF& 'on modifie la valeur de l'index du tableau correspondant à l'offset ou l'on veux modifier le fichier
        F_array(11) = &HE9& ' ""
        F_array(16) = &HF9& ' ""
        F_array(18) = &HA&  ' ""
        'on veux modifier les 20 derniers octets du fichiers en la valeur hexadecimale FF
        Dim n As Long
        For n = F_array.GetUpperBound(0) - 20 To F_array.GetUpperBound(0)
            F_array(n) = &HFF&
        Next n

        'Maintenant qu'on a modifier toutes nos valeurs dans le tableau, on peut donc le réecrire :

        Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin)) 'on defini hbwrite comme BinaryWriter, auquel on doit specifier le mode d'ouverture (File.OpenWrite) et le chemin du fichier
        hbwrite.BaseStream.Seek(0, SeekOrigin.Begin)   'defini le pointeur d'ecriture au debut du fichier
        hbwrite.Write(F_array) 'on ecrit le contenu de teststr dans le fichier ouvert en ecriture, vu que l'on veux ecrire tout le tableau, il n'est pas obligé de specifier l'index de depart et le nbre d'octets
        hbwrite.BaseStream.Flush() 'on libere le buffer
        hbwrite.Flush() 'on libere le buffer
        hbwrite.Close()
    End Sub

    'et la donc, des methodes un peu plus propre... du moins ca n'ouvre pas le fichier... mais ca y accede + souvent

    'modifie des octets du fichier dont on connait l'offset sans le lire :
    Private Sub modifyfile2(ByVal chemin As String)

        Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin)) 'on defini hbwrite comme BinaryWriter, auquel on doit specifier le mode d'ouverture (File.OpenWrite) et le chemin du fichier
        hbwrite.BaseStream.Seek(10, SeekOrigin.Begin) 'on defini le pointeur à l'offset 0x0000000A (10)
        hbwrite.BaseStream.WriteByte(&HFF&) 'on ecrit notre nouvel valeur : FF en hexa (255)
        hbwrite.BaseStream.Seek(11, SeekOrigin.Begin)  'on defini le pointeur à l'offset 0x0000000B (11)
        hbwrite.BaseStream.WriteByte(&HE9&) 'on ecrit notre nouvel valeur : E9 en hexa (233)
        hbwrite.BaseStream.Seek(16, SeekOrigin.Begin) 'on defini le pointeur à l'offset 0x00000010 (16)
        hbwrite.BaseStream.WriteByte(&HF9&) 'on ecrit notre nouvel valeur : F9 en hexa (249)
        hbwrite.BaseStream.Seek(18, SeekOrigin.Begin)  'on defini le pointeur à l'offset 0x00000012 (10)
        hbwrite.BaseStream.WriteByte(&HA&) 'on ecrit notre nouvel valeur : 0A en hexa (10)

        'boucle qui modifie les 20 derniers octets du fichier en FF :
        Dim x As Long
        Dim n As Long
        x = FileLen(chemin)
        For n = (x - 20) To (x - 1)
            hbwrite.BaseStream.Seek(n, SeekOrigin.Begin) ' n represente notre offset, donc de taille fichier - 20 jusqu'a la fin du fichier

            hbwrite.BaseStream.WriteByte(&HFF&)
        Next
        hbwrite.Flush()
        hbwrite.Close()
    End Sub

    'un moyen logiquement plus rapide que la boucle precedente :
    Private Sub modifyfile3(ByVal chemin As String)
        Dim F_array(19) As Byte
        Dim i As Long
        For i = 0 To F_array.GetUpperBound(0)
            F_array(i) = &HFF&      'on met les valeurs dans notre tableau avant l'accés au fichier
        Next i
        Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin)) 'on defini hbwrite comme BinaryWriter, auquel on doit specifier le mode d'ouverture (File.OpenWrite) et le chemin du fichier
        hbwrite.BaseStream.Seek(FileLen(chemin) - 20, SeekOrigin.Begin)     'defini le pointeur d'ecriture à l'offset "taille du fichier - 20"
        hbwrite.Write(F_array) 'on ecrit le tableau
        hbwrite.BaseStream.Flush() 'on libere le buffer
        hbwrite.Flush() 'on libere le buffer
        hbwrite.Close()
    End Sub

    'je suis fatigué, je reviendrais surement la dessus plus tard, il existe encore pas mal de moyen et la lecture n'a pas été tres appronfondie ici... neanmoins je pense que cela reste assez simple, et j'espere que ces exemples pourront ai 
'J'ai oublier de mettre comment ajouter des octets à la fin du fichier, je le ferais demain ...

Conclusion :


voila, en esperant que cela puisse servir à d'autres.

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.