jnbrunet
Messages postés258Date d'inscriptionsamedi 25 décembre 2004StatutMembreDernière intervention13 novembre 2012
-
5 mai 2007 à 21:31
jnbrunet
Messages postés258Date d'inscriptionsamedi 25 décembre 2004StatutMembreDernière intervention13 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).
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
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,
jnbrunet
Messages postés258Date d'inscriptionsamedi 25 décembre 2004StatutMembreDernière intervention13 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?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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)
jnbrunet
Messages postés258Date d'inscriptionsamedi 25 décembre 2004StatutMembreDernière intervention13 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 !