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

 .NET Discussion :

zip avec SharpZipLib


Sujet :

.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut zip avec SharpZipLib
    Bonsoir,

    je dois créer un zip grâce un serveur web (en asp.NET MVC 4) avec download automatique. J'arrive a créer le zip et a le downloader automatiquement mais quand je le dézippé je me rend compte qu'il m'a absolument mis tout le chemin pour dans le zip. Je m'explique.

    par exemple mon répertoire a zippé est là

    c:/titi/tutu/Monprojet/a_ziper/something/

    quand je le dézippe j'ai :
    /titi/tutu/MonProjet/a_ziper/something/

    alors que moi je veux /something et ses enfant si il y en a

    lien vers la lib que j'utilise : https://github.com/icsharpcode/SharpZipLib

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     private static ZipOutputStream addFile(ZipOutputStream zip, string pathFile, long length)
            {
                byte[] buffer = new byte[4096];
                FileStream fs = new FileStream(pathFile, FileMode.Open);
                ZipEntry entry = new ZipEntry(name);
                entry.Size = length;
                zip.PutNextEntry(entry);
     
                int count = fs.Read(buffer, 0, buffer.Length);
                while (count > 0)
                {
                    zip.Write(buffer, 0, count);
                    count = fs.Read(buffer, 0, buffer.Length);
                }
                fs.Close();
                return zip;
            }
     
            private static ZipOutputStream addDirecotry(ZipOutputStream zip, string pathDir)
            {
                DirectoryInfo currentdir = new DirectoryInfo(pathDir);
                DirectoryInfo[] dirs = currentdir.GetDirectories();
                FileInfo[] files = currentdir.GetFiles();
     
                foreach (FileInfo f in files)
                {
                    zip = FileSystem.addFile(zip, f.FullName, f.Length);
                }
                foreach (DirectoryInfo d in dirs)
                {
                    zip = FileSystem.addDirecotry(zip, d.FullName);
                }
                return zip;
            }
            public static ZipOutputStream getZip(string path, Stream ouput)
            {
     
                ZipOutputStream zipOutputStream = new ZipOutputStream(ouput);
                zipOutputStream.SetLevel(0); //0-9, 9 being the highest level of compression
                ZipOutputStream test = new ZipOutputStream(ouput);
     
     
                zipOutputStream = FileSystem.addDirecotry(zipOutputStream, path);
     
                zipOutputStream.Close();
                return zipOutputStream;
     
            }
    comment fait-on

    merci d'avance.

  2. #2
    Membre habitué Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    Au lieu du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZipEntry entry = new ZipEntry(name);
    J'utiliserais plutôt celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZipEntry entry = zipEntryFactory.MakeFileEntry(dossierRelatif + nomFichierSource);
    Avec dossierRelatif qui contient, comme son nom l'indique, un chemin relatif. C'est à dire qu'au lieu de contenir "c:/titi/tutu/Monprojet/a_ziper/something/", il doit contenir "something/".

    La difficulté sera de faire la distinction entre "pathFile" qui doit contenir le chemin réèl du fichier pour lire son contenu, et "dossierRelatif + nomFichierSource" qui doivent contenir son chemin relatif pour l'indiquer dans l'archive. Je pense qu'il va falloir revoir l'architecture des fonctions. Je vous suggère celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Declarations
    private static ZipOutputStream addFile(ZipOutputStream zip, string fileAbsolutePartPath, string fileRelativePartpath, long length)
    private static ZipOutputStream addDirecotry(ZipOutputStream zip, string directoryAbsolutePartPath, string directoryRelativePartpath)
     
    // Appels
    addFile(zip, "c:/titi/tutu/Monprojet/a_ziper/", "something/FileName", long length)
    addDirecotry(zip, "c:/titi/tutu/Monprojet/a_ziper/", "something/")
    Ainsi, lorsque vous parcourez votre arborescence, "fileAbsolutePartPath" et "directoryAbsolutePartPath" restent fixes alors que "fileRelativePartpath" et "directoryRelativePartpath" évoluent au fil de celle-ci.

    Enfin, trois avis personnels :
    • Si vous placez le dossier que vous compressez dans le même répertoire que votre exécutable, vous n'aurez plus besoin de la partie fixe des chemins puisque le programme pourra localiser les fichier et dossier avec les même chemin relatif que ceux que vous désirez dans votre archive.
    • Le paramètre "length" peut être calculé dans la méthode "addFile" elle même. Vous gagnez en ré-utilisabilité (et en élégance) si vous le faite disparaitre.
    • Vos méthodes retournent le "ZipOutputStream" que vous leur fournissez en argument, ce qui ne vous apporte pas grand chose. Si vous retournez le nombre de fichiers ajoutés, par contre, vous pourrez au final, savoir si l'archive contient des fichiers ou une arborescence vide.


    LeCygne

Discussions similaires

  1. Ouvrir un Zip avec mot de passe
    Par arnopalace dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 06/07/2009, 13h26
  2. Bibliothèque zip avec cryptage AES
    Par guilig dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 01/02/2007, 18h30
  3. Comment créer un zip avec le VB ?
    Par faloc82 dans le forum VBScript
    Réponses: 1
    Dernier message: 30/08/2006, 10h17
  4. Ouvrir les archive zip avec l'explorateur windows
    Par koKoTis dans le forum Windows XP
    Réponses: 2
    Dernier message: 20/08/2006, 23h17
  5. ZIP avec C++ standart (pas Visual)
    Par georgi dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 03/06/2006, 18h14

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