Supprimer un octet d'un fichier binaire [Résolu]

jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 5 mai 2007 à 21:31 - Dernière réponse : jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention
- 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-
Afficher la suite 

6 réponses

Répondre au sujet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 6 mai 2007 à 00:08
+3
Utile
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++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 5 mai 2007 à 23:06
0
Utile
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
Commenter la réponse de Charles Racaud
jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 5 mai 2007 à 23:31
0
Utile
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-
Commenter la réponse de jnbrunet
violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention - 6 mai 2007 à 00:48
0
Utile
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
Commenter la réponse de violent_ken
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 6 mai 2007 à 01:07
0
Utile
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++
Commenter la réponse de BruNews
jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 6 mai 2007 à 05:18
0
Utile
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-
Commenter la réponse de jnbrunet

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.