Ecriture dans un gros fichier binaire [Résolu]

Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
- - Dernière réponse : cs_youyou40
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
- 13 janv. 2009 à 11:04
Bonjour à tous et mes meilleurs voeux pour 2009.

Voici mon problème :
Je voudrais rajouter des octets dans un fichier binaire de grande taille, jusqu'à 2 Go octets.

Plus précisément, j'ai un gros fichier binaire et je veux insérer , à un offset que je connais, une liste d'octets (que j'ai dans une chaine par exemple). Je veux l'insérer et non remplacer des octets existants : le fichier obtenu sera donc plus long.

L'instruction Put écrit des octets , mais à la place des octets existants, je crois.
Comment faire pour ne perdre aucun des octets du fichier de départ , c'est-à-dire pour rajouter par insertion une liste d'octets ,sachant que le fichier est gros?

Merci d'avance pour votre aide
Michel
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
3
Merci
Une astuce toute bête : soit par exemple un fichier de 2000 octets et on veut insérer à partir de la position 1000 un bloc de 500 octets
 -   Ouvrir le fichier en mode Append
 -   Ajouter 500 octets nuls à la fin du fichier
 -   Fermer le fichier
-    Rouvrir le fichier en mode Binary
-    Déplacer les 1000 octets de la position 1000 à 1500
-    Insérer les 500 octets à la position 1000
-    Fermer le fichier
ainsi on ne crée point de nouveau fichier

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Galain
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
3
Merci
fait des paquets de 8Ko, par exemple
utilises pour cela un tableau de bytes
gaffe au dernier bloc, qui sera plus petit, surement

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
C'est simple
-  Ouvrir ton fichier
- Ouvrir un nouveau fichier
- Transférer les octets avant insertion de ton fichier vers le nouveau fichier
- Insérer tes octets dans ton nouveau fichier
- Transférer les octets après insertion de ton fichier vers le nouveau fichier
- Ton nouveau fichier est prêt

Attention aux limites de VB 6.0 en ce qui concerne la taille des fichiers ( 2 Go octets maximum si mes souvenirs sont bons : à vérifier)

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
la solution proposée est bonne, simple à mettre en place et efficace en charge et temps d'execution.
Attention cependant, car elle nécessite d'avoir assez d'espace disque pour stocker le fichier temporaire.

point sur lequel il faudra être attentif.

Gaffe également a la taille des tronçons que tu vas transférer. s'agirait pas de saturer la RAM avec un bête programme de patch
Commenter la réponse de Renfield
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
0
Merci
Merci pour vos réponses.

Mais j'avais écarté cette solution car elle nécessite la création d'un fichier de 2Go si celui de départ fait 2Go.

Les fichiers traités par mon utilitaires se trouvent en général sur une carte microSD, donc je voudrais éviter la création de gros fichiers.

Je voudrais modifier ce fichier, mais sans créer de nouveau fichier (si c'est possible).
Par exemple , c'est ce que fait l'instruction Put : on peut remplacer des octets à l'intérieur du fichier, sans réécrire de nouveau fichier , juste en changeant les octets nécessaires.

Je voudrais donc insérer des octets mais Put ne peut pas le faire je crois.

J'avais pensé utiliser Put par tranche  de 10 Mo par exemple : par exemple pour insérer strMesOctets à l'offset 0x4000 , Je mets les 10Mo qui suivent dans une variable temp1 et les 10 suivants dans une variable temp2, puis avec Put j'écris strMesOctets à cet offset 0x4000,   avec Put j'écris ensuite temp1 dans mon fichier puis je recommence : je mets temp2 dans temp1 et les 10Mo qui suivent dans temp2 etc  ...ainsi je n'écris aucun nouveau fichier mais c'est un peu lourd ...

N'y-a-t-il pas un autre moyen ?
Ne peut-on pas insérer directement des octets dans un fichier ? avec une API ? Ou peut-on couper un fichier en deux puis recoller des fichiers entre eux ? avec une API ?
Commenter la réponse de cs_youyou40
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
décaler peut etre les bits qui suivent la modif...
Commenter la réponse de Renfield
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
0
Merci
Oui c'est exactement ce que je voudrais faire, mais comment les décaler ? Il n'y a pas d'instruction vb qui fasse cela ?
Commenter la réponse de cs_youyou40
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
Galain a bien détaillé la solution que je mentionnais plus haut.
tu as donc toutes les billes pour avancer, me semble t'il
Commenter la réponse de Renfield
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
0
Merci
Merci encore pour vos réponses.

Je n'avais pas pensé à rallonger le fichier avant de décaler ( car Put rallonge le fichier si nécessaire) : je comptais décaler en commençant par l'octet à 1000 pour le mettre à 1500 mais il me fallait alors une seconde variable pour sauvegarder l'octet 1500 avant qu'il ne soit écrasé...d'où mes deux variables temp1 et temp2 dont je parlais plus haut.

C'est effectivement beaucoup plus simple ainsi , en commençant le décalage par la droite.

Mais une dernière question :
si j'ai bien compris je dois faire une boucle du genre:
   Dim temp as Byte
      For  i = 1000 to 0
            Get  #1 , 1000 + i , temp
            Put  #1 , 1500 + i , temp
   Next i

C'est bien ça?
Mais pour un fichier de 2 Go , cela fait dans les 2 000 000 000 de boucles . Est-ce qu'il ne vaut mieux pas le faire par tranche de plusieurs octets, à l'aide d'une String, au lieu d'un Byte ?  Et si oui, quelle taille de String me recommandez-vous  (euh .... je parle toujours informatique  bien sûr   ) ?
Commenter la réponse de cs_youyou40
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
0
Merci
Merci encore!!

Que dire de plus ?  J'ai toutes les réponses à mes questions et vite en plus !

Super site, bon esprit , un vrai régal.

A bientôt
Michel
Commenter la réponse de cs_youyou40