Supprimer un octet d'un fichier binaire

Résolu
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 5 mai 2007 à 21:31
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 6 mai 2007 à 05:18
Salut,
J'aimerais savoir si, en utilisant IO, il est possible de supprimer complètement un octet d'un fichier. Je peux toujours déplacer tous les octets vers la gauche à partir de celui dont je veux supprimer, mais cette facon me laisse un octet inutile à la fin du fichier. Donc y-a t'il une façon de supprimer cet octet définitivement du fichier binaire? IO me permet simplement d'écrire et de lire, mais pas de supprimer ni d'insérer à l'intérieur d'un fichier en poussant les octets suivvant (pour l'insertion, je me suis débrouiller et j'ai fait moi même un algorithme pour insérer des octets à l'intérieur sans écraser les autres octets).

Merci,
-Jn-

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 mai 2007 à 00:08
Par API avec un buffer de 32 Ko:
dim d As Long, v As Long
hfile = CreateFile(...)
SetFilePointer() sur position derrière l'octet à enlever.

boucle:
ReadFile(hfile, buffer, 32768, d, 0);
If d = 0 Then Goto FINI
SetFilePointer(hfile, -(d + 1), 0, FILE_CURRENT)
WriteFile(hfile, buffer, d, v, 0)
If d < 32768 Then Goto FINI
SetFilePointer(hfile, 1, 0, FILE_CURRENT)
Goto boucle
FINI:
CloseHandle(hfile)

Ma syntaxe VB n'est surement pas tip top mais l'algo y est.

ciao...
BruNews, MVP VC++
3
Utilisateur anonyme
5 mai 2007 à 23:06
Salut,

Il faut travailler le tableau.
Comme tu l'as dit, on fait une boucle pour tout décaler et ensuite, on change la taille. Et on récrit le tout.




Private Sub RemoveByte(ByVal Path As String, ByVal Index As Integer)
  Dim Bytes As Byte() = System.IO.File.ReadAllBytes(Path)
  Call RemoveByte(Bytes, Index)
  System.IO.File.WriteAllBytes(Path, Bytes)
End Sub
Private Sub RemoveByte(ByRef Bytes As Byte(), ByVal Index As Integer)
  For iByte As Integer = Index To Bytes.Length - 2
    Bytes(iByte) = Bytes(iByte + 1)
  Next iByte
  System.Array.Resize(Of Byte)(Bytes, Bytes.Length - 1)
End Sub,

----

(Coloration syntaxique automatique par Kenji)




__________
 Kenji
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
5 mai 2007 à 23:31
Oui j'avais pensé à cette manière, ce que je n'aime pas, c'est qu'on charge tout les octets en mémoire, et l'application que je développe(pour un travail d'école) doit pouvoir fonctionner sur des très vieux ordinateur et donc utiliser le moin de mémoire possible. J'essais donc de fonctionner sans tout charger en mémoire. Une autre solution peut etre?

Merci quand même pour cette réponse !
-Jn-
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
6 mai 2007 à 00:48
Violent Ken
Pour reprendre ce que disait Brunews, tu trouveras dans cette source
http://www.vbfrance.com/codes/FILESYSTEMLIBRARY-TOUT-FSO-SUR-FICHIERS-DOSSIERS-DISQUES_42404.aspx
les procédures pour lire/écrire dans un fichier avec CreateFile/ReadFile/WriteFile/SetFilePointer/CloseHandle.

C'est du VB6, mais comme c'est que de l'API, çà devrait pas poser de problèmes à mettre en .Net.
@+

Hex Editor VB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 mai 2007 à 01:07
OUPS, manque un truc au label FINI:
FINI:
SetEndOfFile(hfile)
CloseHandle(hfile)

L'algo plus haut est juste pour bien voir le principe. On pourrait en fait se débarrasser du dernier SetFilePointer de la boucle, faudrait un buffer de 1 octet plus grand et écrire (d+1) octets au lieu de d, ce qui nous positonnerait direct sur le prochain offset de lecture.
boucle:
ReadFile(hfile, buffer, 32768, d, 0);
If d = 0 Then Goto FINI
SetFilePointer(hfile, -(d + 1), 0, FILE_CURRENT)
WriteFile(hfile, buffer, d + 1, v, 0)
If d = 32768 Then Goto boucle ' FICHIER PEUT-ETRE PAS FINI
FINI:
SetEndOfFile(hfile)
CloseHandle(hfile)

ciao...
BruNews, MVP VC++
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
6 mai 2007 à 05:18
Ok super, je vais regarder ca ! Je vais toutefois enlever les goto... sinon j'ai un 0 assuré dans mon travail ! :P ... sinon ca pourrait en effet résoudre mon problème !

Merci !

-Jn-
0
Rejoignez-nous