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 :

get_dir_size avec boost


Sujet :

Boost C++

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut get_dir_size avec boost
    Bonjour,

    Je souhaite connaitre la taille d'un répertoire, et ce, en utilisant la librairie boost qui est préconisée dans notre application.

    J'ai vu un exemple intéressant... mais impossible à compiler.
    (les boost::transform_iterator, c'est pas forcément trivial je trouve !).

    Avez vous une idée ?

    exemple :
    http://cboard.cprogramming.com/linux...cplusplus.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <boost/cstdint.hpp>
    #include <algorithm>
    #include <boost/filesystem.hpp>
    #include <boost/bind.hpp>
    #include <boost/iterators/transform_iterator.hpp>
    namespace fs = boost::filesystem;
     
    boost::uintmax_t dir_size(const fs::path &p)
    {
      return std::accumulate(
        boost::make_transform_iterator(&fs::file_size, fs::recursive_directory_iterator(p)),
        boost::make_transform_iterator(&fs::file_size, fs::recursive_directory_iterator()),
        static_cast<boost::uintmax_t>(0));
    }

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonsoir,

    Tout d'abord, il semble que make_transform_iterator prenne l'iterateur en premier argument, et la fonction en deuxième. Ensuite, la fonction file_size est template, donc il faut spécifier quel version tu veux. Un code corrigé ressemblerait a ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      return std::accumulate(
        boost::make_transform_iterator(fs::recursive_directory_iterator(p), &fs::file_size<fs::path>),
        boost::make_transform_iterator(fs::recursive_directory_iterator(), &fs::file_size<fs::path>),
        static_cast<boost::uintmax_t>(0));
    (il ne faut pas oublier d'inclure <numeric> aussi, pour le accumulate)

    Une version un peu plus facile a comprendre serai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	size_t size = 0;
    	fs::recursive_directory_iterator iter = fs::recursive_directory_iterator(p);
    	fs::recursive_directory_iterator endIter = fs::recursive_directory_iterator();
    	while(iter != endIter)
    	{
    		size += fs::file_size(*iter);
    		++iter;
    	}
    	return size;

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut
    Merci pour ta réponse.
    Le premier exemple compile bien... mais ça plante. On ne peut pas appeler get_size sur un directory. Il faut regarder le status auparavant.

    D'où la 2eme solution, qui est effectivement plus claire, et dans laquelle on peut checker le status.

    Maintenant, quel est le but d'écrire du code aussi concis que la 1ere solution. Y-a t-il des gains de performance ? Le std::accumulate ne fait ni plus ni moins qu'un +=

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Le but est de rendre la boucle implicite, ce qui permet :
    - D'éviter de faire des erreurs liées au parcours lui même
    - Éventuellement de remplacer un jour ce parcours séquentiel par un parcours plus rusé, par exemple parallélisé.

    Le problème étant qu'en C++ actuel (ça ira mieux en C++0x), écrire le corps de la boucle est peu aisé (par exemple faire le test de status dont tu parles. C'est possible, mais lourd).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut
    Ok merci pour l'info. Ca me semble plus clair maintenant.

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

Discussions similaires

  1. [boost] Problème avec boost::function
    Par Bakura dans le forum Boost
    Réponses: 3
    Dernier message: 22/03/2007, 20h08
  2. Questions de perfomance avec boost::thread
    Par Rafy dans le forum Boost
    Réponses: 36
    Dernier message: 05/10/2006, 15h21
  3. probleme de compilation avec boost
    Par doof dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 07/06/2005, 21h38
  4. Calculer un inverse de matrice avec boost?
    Par Clad3 dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 02/06/2005, 18h38
  5. probleme avec boost et devcpp
    Par Krost dans le forum Dev-C++
    Réponses: 12
    Dernier message: 02/01/2005, 19h11

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