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

Boost C++ Discussion :

Décompresser une archive


Sujet :

Boost C++

  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut Décompresser une archive
    Bonjour à tous,

    Je cherche actuellement une solution "élégante" pour décompresser une archive.
    Vu que Boost est installé sur ma machine, pourquoi ne pas l'utiliser...

    Mais voilà que :
    LINK : fatal error LNK1104: impossible d'ouvrir le fichier 'libboost_zlib-vc80-mt-1_33_1.lib'
    Alors que j'ai installé Boost dans les règles de l'art. Effectivement cette lib n'est pas présente dans le dossier. Mais je comprend pas pourquoi il cherche ce truc...


    Pour info, voici mon code (donné en exemple sur le site de Boost)
    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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <boost/iostreams/filtering_streambuf.hpp>
    #include <boost/iostreams/copy.hpp>
    #include <boost/iostreams/filter/zlib.hpp>
     
     
    int main()
    {
    	std::string fichier = "test.gz";
     
    	using namespace std;
    	ifstream file(fichier.c_str(), ios_base::in | ios_base::binary);
    	boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    	in.push(boost::iostreams::zlib_decompressor());
            in.push(file);
            boost::iostreams::copy(in, cout);
     
    	return 0;
    }
    Merci d'éclairer ma lanterne !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    iostreams dépend de zlib pour tout ce qui est compression.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    J'ai fait un fichier test avec la Zlib (en version DLL compilé) et
    c'est tout ce dont a besoin Zlib pour fonctionner...

    Je vois pas pourquoi Boost cherche cette lib... Ca commence à m'énerver!

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Avec Zlib j'arrive à compresser un fichier, mais pas à décompresser un fichier .zip (pas compatible)...
    Ca fait 5 heures que je suis dessus, je vais pas m'en sortir !

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    zlib ne fait qu'appliquer un algorithme de compression à une séquence d'octets. Les fichiers .zip eux font beaucoup plus, puisqu'ils gèrent une arborescence de fichiers.

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Eh oui...
    M'enfin en théorie dans mon cas ça devrait marcher puisque la source est compressée avec Zlib, et c'est à moi de la décompresser...
    J'ai essayé avec Zlib, mais j'arrivais pas, le code plantait avec un code d'erreur -3...

    Avec Boost j'ai pas eu plus de succès puisque j'ai pas réussi à linker.
    L'exemple qui est donné dans Boost : http://www.boost.org/libs/iostreams/doc/index.html
    ne marche pas chez moi...
    Ai-je mal installé la Zlib?
    Mystère...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Pour l'installation je ne sais pas, mais prends garde car le fait que ton fichier soit compressé en zlib ne veut pas dire que ce soit une archive. En admettant que ce soit un tar.gz tu te retrouveras avec un fichier tar que tu ne sauras probablement pas utiliser.

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Normalement si...

    Je récupère un film compressé sur un seveur (ça c'est fait ).
    Puis je dois décompresser ce film avant de faire mon boulot!!!

    Je ne demande qu'à faire mon boulot, mais je m'en sors pas avec cette Zlib...

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Ca y est !!
    J'ai réussi à faire tourner la Zlib avec Boost...
    Il fallait définir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define BOOST_IOSTREAMS_NO_LIB
    Par contre, le résultat n'est pas celui voulu, ça plante à l'éxécution...


    J'utilise le code suggéré par Boost pour décompresser:
    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
    #define BOOST_IOSTREAMS_NO_LIB
     
    #include <fstream>
    #include <iostream>
    #include <boost/iostreams/filtering_streambuf.hpp>
    #include <boost/iostreams/copy.hpp>
    #include <boost/iostreams/filter/gzip.hpp>
     
     
    int main() 
    {
        using namespace std;
     
        using namespace boost::iostreams;
     
        ifstream file("test.z", ios_base::in | ios_base::binary);
        filtering_streambuf<input> in;
        in.push(gzip_decompressor());
        in.push(file);
     
        boost::iostreams::copy(in, cout);
     
        return 0;
    }
    Dans gzip.hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Read header, without checking header crc.
            if ( boost::iostreams::get(src) != gzip::magic::id1 ||   // ID1.
                 boost::iostreams::get(src) != gzip::magic::id2 ||   // ID2.
                 is_eof(boost::iostreams::get(src)) ||               // CM.
                 is_eof(flags = boost::iostreams::get(src)) )        // FLG.
            {
                throw gzip_error(gzip::bad_header);
            }
            mtime_ = read_uint32(src, gzip::bad_header);        // MTIME.
            read_uint8(src, gzip::bad_header);                 // XFL.
            os_ = read_uint8(src, gzip::bad_header);          // OS.
            if (flags & boost::iostreams::gzip::flags::text)
                flags_ |= f_text;
    Il lance une exception "bad header".

    Ca veut dire quoi? Que mon fichier n'est pas pris en charge bien sûr!
    Mais alors comment faire?

    Quand je l'ouvre avec WinZip, il y a un fichier dedans. Est-ce que ça compte comme un répertoire? Et dans ce cas, la Zlib ne suffit pas?


    Merci pour votre aide !

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faudrait déjà savoir deux choses très importantes :
    - Boost lit-il de bêtes séquences d'octets compressés, ou bien des fichiers avec un format bien défini du genre .zip ou .gz ?
    - Ton fichier a t-il un format particulier ou bien ce n'est qu'une séquence d'octets compressés ?

  11. #11
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    1) De bêtes séquences compressées j'ai l'impression.
    2) Je viens d'apprendre à la seconde que le fichier est zippé à partir de la fonction zip d'UNIX...

    Bref, je crois que ça va pas le faire...

    Donne moi ton avis Laurent

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Vu qu'il cherche un en-tête, j'aurais plutôt pensé que boost voulait ouvrir de vraies archives.

    Si ton fichier a été compressé sous un UNIX alors c'est certainement avec l'utilitaire gzip, ce qui serait très précisément ce que boost semble gérer.

    Ce ne sont que mes suppositions, je ne peux pas t'en dire plus.

  13. #13
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Laurent Gomila
    Vu qu'il cherche un en-tête, j'aurais plutôt pensé que boost voulait ouvrir de vraies archives.
    +1


    Si ton fichier a été compressé sous un UNIX alors c'est certainement avec l'utilitaire gzip, ce qui serait très précisément ce que boost semble gérer.

    Ce ne sont que mes suppositions, je ne peux pas t'en dire plus.
    Oui je vais me renseigner....

  14. #14
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Pour info,
    La commande était unzip sous Unix et non gzip... C'était donc un encryptage sous format propriétaire, et Boost utilisant gzip ne pouvait rien faire...

    C'est quand même frustrant : toutes les distributions d'archive se font avec WinZip ou WinRar, et la zlib ne peut lire aucuns d'entre eux, et vice versa !

    Mon problème s'est résolu avec un accord entre collègue pour utiliser gzip (ce fut long !)

    N'y aurait-il pas quand même un autre moyen? Un collègue a testé avec la zipArchive et ça ne marchait pas non plus !

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    T'as pas tellement le choix, si tu veux utiliser un autre format d'archives il faut la bibliothèque qui sait le lire.

  16. #16
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    A ma connaissance, il n'y a pas de bibliothèque "free" qui connaissent ce format Zip de WinZip...

    Bon...

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    À part ZipArchive.
    Mais donc, tu dis qu'elle ne marche pas ?
    Même buildée en version STL ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Zip n'est pas un format propriétaire, tout le monde peut le lire. Le seul truc, c'est qu'il n'existe pas des masses de trucs pour ça en C++ (par contre tu en trouveras à la pelle pour plein d'autres langages). Boost::iostream n'est pas du tout fait pour ça, il gère la compression/décompression avec gzip et bzip2. Or la compression/décompression n'a rien à voir avec les archives (pour rappel, les archives permettent de grouper plusieurs fichiers en un). On s'en rend particulièrement bien compte sous linux puisqu'on a d'une part le format .tar (archive uniquement, aucune compression) et les formats gzip, bzip2 (compression uniquement, pas d'archive). Si tu veux utiliser boost::iostream tu dois avoir des fichiers compressés et uniquement compressés (donc rien qui aie un rapport avec des archives, il n'a jamais été conçu pour lire le zip ou le tar puisqu'il ne contient aucune fonction permettant de choisir un fichier dans une archive). Si tu veux une biblio qui puisse lire le zip facilement, il y a wxWidgets. Sinon tu as la technique "je me casse pas le cul", tu appelles l'utilitaire unzip avec la ligne de commande (il existe pour toutes les plateformes, il suffit de le fournir avec ton programme).

  19. #19
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Médinoc
    À part ZipArchive.
    Mais donc, tu dis qu'elle ne marche pas ?
    Même buildée en version STL ?
    C'est un collègue qui l'a testé, je l'ai pas fait moi-même... Je resterai à l'occasion, mais a priori ça marchait pas. (compilé en Release Unicode)

  20. #20
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Médinoc
    À part ZipArchive.
    Mais donc, tu dis qu'elle ne marche pas ?
    Même buildée en version STL ?
    Je confirme que ZipArchive fonctionne pour les .zip !
    Mais parmi tous les options de compilations testées sous Visual 2005, il n'y a que la STL Unicode qui compile (en debug et Release) ....

    Enfin, ça marche, c'est l'essentiel !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/12/2009, 16h40
  2. [C#] [WinForms] Lecture d'un fichier dans une archive ZIP
    Par aegypius dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2004, 17h15
  3. [Debutant] Acces à une ressource d'une archive différente.
    Par Gandor dans le forum Général Java
    Réponses: 2
    Dernier message: 30/07/2004, 19h37
  4. Compresser une base
    Par cdlr27 dans le forum Access
    Réponses: 8
    Dernier message: 15/03/2004, 14h15
  5. [ADO] [C#] [VB.NET] Compresser une BD Access par .NET
    Par olivierx dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/03/2004, 09h42

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