Ecrire un fichier binaire à partir d'une ressource [Résolu]

Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
-
Bonjour,

Je me heurte actuellement à un problème qui commence à m'agacer fortement.

J'ai inséré dans le fichier de ressources Resources.resx de mon projet un fichier binaire (une base de données Access vide, mais ce pourrait être autre chose).

Quand j'essaie de créer un fichier sur le disque à partir de cette ressource, je n’obtiens jamais la même chose que l'original. Il s'agit vraisemblablement d'un problème d'encoding, mais je n'arrive pas à le résoudre.

Voici le code que j'utilise :
byte[] EmptyBase = (byte[]) Properties.Resources.ResourceManager.GetObject("EmptyBase");
StreamWriter SW = new StreamWriter(dlg.FileName, false, Encoding.Default);
foreach(byte Octet in EmptyBase)
    SW.Write(Convert.ToChar(Octet));
SW.Close();


- J'ai essayé TOUTES le valeurs de Encoding (Unicode, ASCII, default, etc) sans résultat.
- j'ai essayé de ne pas employer Convert mais de faire un cast, sans résultat
- J'ai essayé sans cast ni convert, les octets sont écrits sous forme numérique (abc = "656667", etc.)
J'ai aussi essayé d'écrire tout le fichier en une seule fois au lieu d'octet par octet, mêmes résultats.

Il y a surement une façon simple de faire ça, mais je cale lamentablement...
Help !

Le code original (fichier sur le disque) :


Le code généré par l'appli avec Encoding.Default :


Le code généré par l'appli avec Encoding.ASCII :


Le code généré par l'appli avec Encoding.Unicode:
Afficher la suite 

1 réponse

Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
0
Merci
J'ai trouvé !
(C'est bien, je fais les questions et les réponses - J'ai encore posté trop vite...)

En écumant une fois de plus le web, j'ai fini par trouver la solution chez Microsoft.
Au lieu d'un StreamWriter, il suffisait d'utiliser un FileWriter.

Ça donne :
byte[] EmptyBase = (byte[])Properties.Resources.ResourceManager.GetObject("EmptyBase");
FileStream FS = new FileStream(dlg.FileName, FileMode.Create);
foreach (byte Octet in EmptyBase)
    FS.WriteByte(Octet);
FS.Close();


Et c'est tout bon, la sortie est conforme à l'original
Et il n'est plus question d'encoding, ce qui est normal puisqu'on joue avec des octets bruts.
CQFD.

Il me reste à optimiser la chose en cherchant comment écrire en une seule fois le tableau d'octets. Mais cela ne devrait pas être un problème, et si je ne trouve pas je pourrai m'en passer, le fichier faisant moins de 200 Ko.
MGD Software
Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
-
Encore trouvé :
FS.Write(EmptyBase, 0, EmptyBase.Length);
NHenry
Messages postés
14600
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 décembre 2019
137 -
Et il n'y a pas System.IO.File.WriteAllBytes ?
MGD Software
Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
-
FileStream.Write écrit soit un octet si on lui donne 1 octet, soit tout le tableau si on lui donne le tableau.d'octet.
EmptyBase est un byte[ ], et donc FS.Write(EmptyBase, 0, EmptyBase.Length) écrit tout le tableau d'un coup (en fait, depuis l'offset donné et selon la longueur fournie). Pas besoin de WriteAll, Write est polymorphe.
PS : Il faut bien sur supprimer la boucle et ne laisser que le Write.
NHenry
Messages postés
14600
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 décembre 2019
137 -
Quand tu as un tableau d'octet en source, l'avantage de WriteAllBytes est que ça fait tout en un seul bloc (ouverture, écriture et fermeture) donc pas de risque de laisser le fichier ouvert par erreur.
MGD Software
Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
-
C'est effectivement plus simple et efficace. J'ai pris note et modifié mon code.
Merci.
Commenter la réponse de MGD Software