2009-11-19 3 views
3

J'utilise l'objet stream de filtrage boost pour lire les fichiers gzippés. Fonctionne très bien! Je voudrais afficher une barre de progression pour la quantité de fichier qui a été traitée. J'ai besoin de trouver la taille du fichier non compressé d'entrée. Est-ce que le décompresseur gzip a accès à la taille du fichier d'origine à partir du fichier gzippé? Je n'ai pas pu le trouver sur la page boost gzip_decompressor reference. Vraiment le dialogue de progrès est l'objectif, est-il un autre moyen de comprendre la position dans le fichier compressé?boost filtering_istream gzip_decompressor taille de fichier non compressé

// gets compressed file size, need uncompressed size 
    boost::uintmax_t fs = boost::filesystem::file_size (
     boost::filesystem::path (fname) 
     ); 

    std::ifstream file (fname, std::ios_base::in | std::ios_base::binary); 
    boost::iostreams::filtering_istream in; 
    in.push (boost::iostreams::gzip_decompressor()); 
    in.push (file); 

    std::string line; 
    size_t bytes_read = 0; 
    while (in) 
    { 
     std::getline (in, line); 
     bytes_read += line.size(); 
     // progress dlg with bytes_read/uncompressed size 
    } 

Répondre

4

Les informations que vous êtes après est certainement là (la taille des données non compressées sont enregistrées dans les 4 derniers octets d'un fichier gzip, (voir GZIP spec), mais un regard sur les en-têtes de la bibliothèque Boost (voir here) Vous pouvez lire la valeur vous-même directement dans le fichier (il suffit d'assembler les 4 derniers octets dans le fichier read_footer). un int, en étant conscient de leur commande (voir GZIP spec à nouveau)), ou utiliser une bibliothèque différente pour faire la décompression

+0

Il est assez facile de chercher à la fin du fichier et lire la taille. Je suppose que je ferai ça. Merci. – Dan

+6

Ou, vous pouvez modifier boost pour ajouter cette information et soumettre un correctif pour cela. Alors tout le monde profite du travail. – KeithB

Questions connexes