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 : 45
    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 : 51
    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