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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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
Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
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
1
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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