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