IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

MemoryStream / FileStream et zip de fichiers.


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut MemoryStream / FileStream et zip de fichiers.
    Bonjour à tous,

    J'ai un problème et j'aurais grand besoin de votre aide.

    Je dois compresser des fichiers (j'utilise SharpZipLib), pour ensuite convertir le flux en string pour l'envoyer via Web Service.

    Voici habituellement comment s'utilise la compression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                FileStream fs = File.Create(@"c:\toto.zip");
     
                using (ZipOutputStream zip = new ZipOutputStream(fs))
                {
    En faisant ceci, j'ai bien un fichier .zip de créé, avec tous les fichiers que je souhaite dedans.

    Etant donné que je veux convertir ce flux en string, passer par l'objet MemoryStream, puis faire un ToArray() et ensuite convertir en base 64 est plus logique.

    Je fais donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                MemoryStream ms = new MemoryStream();
     
                using (ZipOutputStream zip = new ZipOutputStream(ms))
                {
    et à la fin un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte[] bytedata = ms.ToArray();
    Je converti en base 64 pour l'envoyer via le Web Service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                string strBase64 = Convert.ToBase64String(bytedata);

    Le WebService recoit donc une chaine de caractère et effectue le traitement, à savoir l'enregistrement sur le disque du fichier zip recu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                byte[] tabByte = Convert.FromBase64String(strBase64);
     
                File.WriteAllBytes(@"c:\dumped.zip", tabByte);
    Or quand j'ouvre ce fichier zip, tous les fichiers sont présents, mais il y a toujours un fichier vide (0 octet) !

    Il n'y a pas de problème de compression étant donné que le FileStream crée bien le fichier correctement, et tous les fichiers sont bien présents et font la bonne taille via cette méthode.

    Pourriez vous m'éclairer svp, je suis vraiment bloqué.

    Je vous remercie,

    Antoine.

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Pourriez vous m'éclairer svp, je suis vraiment bloqué.
    Pour cela il va falloir que tu nous éclaires sur ton problème parce que entre un coup : les fichiers sont à 0 ko, et un coup les fichiers sont correctement compressé, je n'ai pas compris où se trouvais l'erreur.

    Il nouas faudra certainement un peu plus de ton code pour comprendre ton erreur.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Je te pris de m'excuser je vais tenter d'être plus clair

    Pour résumer :

    - Si j'utilise le FileStream pour créer le fichier zip, je me trouve bien avec un fichier .zip sur le serveur. L'ensemble des fichiers présents dans ce zip sont correct.

    - Si j'utilise un MemoryStream pour créer le fichier zip, que je transforme cet objet en byte[], et que je créé le fichier physique en faisant un File.WriteAllBytes, le zip créé contient l'ensemble des fichiers, mais il y a toujours un des fichiers égal à 0 octet.


    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
                MemoryStream ms = new MemoryStream();
                byte[] bytedata;
     
                using (ZipOutputStream zip = new ZipOutputStream(ms))
                {
                    zip.SetLevel(level);
     
                    FileInfo[] fileInfos = di.GetFiles("*.*", SearchOption.AllDirectories);
     
                    foreach (FileInfo fileInfo in fileInfos)
                    {
     
                            using (FileStream fs = File.OpenRead(fileInfo.FullName))
                            {
                                // Tableau de byte, de la taille du fichier à lire
                                byte[] buffer = new byte[fs.Length];
     
                                // Lecture
                                fs.Read(buffer, 0, buffer.Length);
     
                                ZipEntry entry = new ZipEntry(fileInfo.FullName.Replace(fullpath, ""));
                                // On ajoute la nouvelle entrée
                                zip.PutNextEntry(entry);
                                zip.Write(buffer, 0, buffer.Length);
                            }
     
                    }
     
                    bytedata = ms.ToArray();
     
                    zip.Finish();
                    zip.Close();
     
                    ms.Close();
                }
     
    			File.WriteAllBytes(@"c:\dumped.zip", bytedata);
    D'avance merci,

    Antoine.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Autant pour moi, je ne finalise pas mon Zip avant de le transformer en tableau de bytes.

    Comme celà ca va mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    zip.Finish();
                    zip.Close();
     
                    bytedata = ms.ToArray();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZIPfile] zip de fichier supperieur a 2 gig
    Par segfault42 dans le forum Général Python
    Réponses: 0
    Dernier message: 07/07/2009, 09h22
  2. Script PERL pour l'archivage/purge/zip de fichiers
    Par jfmerveille dans le forum Langage
    Réponses: 1
    Dernier message: 30/03/2007, 12h52
  3. Probleme de Zip des fichiers
    Par lephyrexian dans le forum VBScript
    Réponses: 25
    Dernier message: 16/01/2007, 10h46
  4. Probleme de Zip des fichiers
    Par lephyrexian dans le forum VBScript
    Réponses: 16
    Dernier message: 15/12/2006, 10h17
  5. [VB6]zip et fichier de 0Ko
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 29/05/2006, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo