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 :

Compression de dossier format tar.gz sous C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut Compression de dossier format tar.gz sous C++
    Bonjour,

    je suis à la recherche d'un code / librairie qui me permettrais de compresser un dossier en format tar.gz sous linux en C++.
    J'ai essayer déjà Boost mais je me suis confronté à un problème que je n'ai pas résolut (voir code ci dessous)
    La lib: zlib ne permet pas la compression de dossier mais uniquement de fichier unique.
    Et quand a la lib: libtar, je n'ai quasiment trouvé aucun exemple fiable.

    Merci à vous si vous avez une idée..


    PS: mon code avec la lib: 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
    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
     
    #include <cstddef>
    #include <string>
    #include "Zipclass.h"
    #include "zlib.h"
    #include <boost/iostreams/filtering_stream.hpp>
    #include <boost/iostreams/copy.hpp>
    #include <boost/iostreams/filter/zlib.hpp>
    #include <boost/iostreams/filter/gzip.hpp>
    #include <boost/iostreams/device/file.hpp>
    #include <boost/iostreams/device/array.hpp>
    #include <boost/iostreams/device/back_inserter.hpp>
    #include <boost/iostreams/filter/test.hpp>
    #include <boost/ref.hpp>
    #include <boost/range/iterator_range.hpp>
    #include <boost/test/test_tools.hpp>
    #include <boost/test/unit_test.hpp>
     
    #define TEMP_DIRECTORIE "/opt/appl/var/"
    #define compressionLevel 0
     
     
    using namespace std;
    using namespace boost;
    //using namespace boost::iostreams;
     
     
     
    Zipclass::Zipclass(std::string input_directory, std::string output_file)
    {
     
    	std::vector<char>  temp, dest;
     
    	std::string fileName = std::string(TEMP_DIRECTORIE) + std::string("tempfile.gz");
     
    	std::ofstream file;
    	file.open(fileName.c_str(), std::ios_base::out | std::ios_base::binary);
     
    	//filtering_stream<output> out;
    	boost::iostreams::gzip_params params;
     
    	params.file_name = fileName;
    	params.level = boost::iostreams::zlib::best_compression;
     
    	boost::iostreams::gzip_compressor out(params);
    }
    Résultat:
    ./../src/Zipclass.cpp:52: undefined reference to `boost::iostreams::zlib::default_compression'
    ./../src/Zipclass.cpp:52: undefined reference to `boost::iostreams::zlib::deflated'
    ./../src/Zipclass.cpp:52: undefined reference to `boost::iostreams::zlib::default_strategy'
    ./../src/Zipclass.cpp:52: undefined reference to `boost::iostreams::zlib::best_compression'

    ps je travail sous eclipse C++, avec ubuntu

    Thx

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    On m'avait conseillé minizip fut un temps. Voici un exemple de code fonctionnel trouvé sur le ouèb :
    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
    int CreateZipFile (std::vector<wstring> paths)
    {
        zipFile zf = zipOpen(std::string(destinationPath.begin(), destinationPath.end()).c_str(), APPEND_STATUS_CREATE);
        if (zf == NULL)
            return 1;
     
        bool _return = true;
        for (size_t i = 0; i < paths.size(); i++)
        {
            std::fstream file(paths[i].c_str(), std::ios::binary | std::ios::in);
            if (file.is_open())
            {
                file.seekg(0, std::ios::end);
                long size = file.tellg();
                file.seekg(0, std::ios::beg);
     
                std::vector<char> buffer(size);
                if (size == 0 || file.read(&buffer[0], size))
                {
                    zip_fileinfo zfi = { 0 };
                    std::wstring fileName = paths[i].substr(paths[i].rfind('\\')+1);
     
                    if (S_OK == zipOpenNewFileInZip(zf, std::string(fileName.begin(), fileName.end()).c_str(), &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION))
                    {
                        if (zipWriteInFileInZip(zf, size == 0 ? "" : &buffer[0], size))
                            _return = false;
     
                        if (zipCloseFileInZip(zf))
                            _return = false;
     
                        file.close();
                        continue;
                    }
                }
                file.close();
            }
            _return = false;
        }
     
        if (zipClose(zf, NULL))
            return 3;
     
        if (!_return)
            return 4;
        return S_OK;
    }

  3. #3
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Super,

    Merci à toi, je vais tester ça tout de suite !!

  4. #4
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    salut prgasp77,

    merci pour ta réponse, j'ai essayer le code mais j'ai du mal à le compiler.
    Je voulais savoir qu'est ce qui était attendu dans "destinationPath.begin()" & "destinationPath.end()"
    si je dois directement utilisé les parametres std::vector<std::wstring> paths ?
    soit paths.begin() ...

    Merci

  5. #5
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Tu peux trouver un autre exemple d'utilisation de la lib sur github : https://github.com/nmoinvaz/minizip/...ster/minizip.c

    Tu remarqueras qu'il s'agit d'une bibliothèque C, et ça répond à toutes tes questions (le C ne connais ni vector ni wstring ...) hormis la question de savoir s'il faut utiliser des char ou des wchar_t.
    Sinon je ne connais pas cette bibliothèque plus que toi, je te recommande donc de faire quelques essais pour comprendre comment elle marche.

  6. #6
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Merci à toi,

    En fait je suis quasiment bon sur le code, je bloque juste sur la compilation de la lib dans mon projet.
    Je crois qu'il me faut faire un make file pour l'incorporé et la faire reconnaitre dans mon projet mais ça ne marche pas

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

Discussions similaires

  1. Compression de dossier en tar.gz
    Par Hyssgrif dans le forum C++
    Réponses: 12
    Dernier message: 28/05/2015, 15h19
  2. [Débutant][C#] Compression de dossier de manière récurssive
    Par LordProgz dans le forum Windows Forms
    Réponses: 10
    Dernier message: 12/01/2010, 13h55
  3. Compression d'un dossier en tar.gz sans garder l'arborescence
    Par MagicManu dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/03/2007, 08h53
  4. Format de date sous Interbase
    Par Vulcanos dans le forum InterBase
    Réponses: 5
    Dernier message: 05/01/2005, 15h29
  5. Formater une durée sous la forme Heure:Minute:Seconde
    Par marsupile dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/01/2004, 23h29

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