cs_youyou40
Messages postés65Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention28 avril 2022
-
11 janv. 2009 à 17:59
cs_youyou40
Messages postés65Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention28 avril 2022
-
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?
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.
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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 12 janv. 2009 à 08:27
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_youyou40
Messages postés65Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention28 avril 2022 12 janv. 2009 à 11:27
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 ?
cs_youyou40
Messages postés65Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention28 avril 2022 13 janv. 2009 à 10:44
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 ) ?