10
votes

Comment compter le nombre de fichiers dans un répertoire utilisant Boost :: FileSystem?

J'ai donné un boost :: Système de fichiers :: chemin. Y a-t-il un moyen rapide d'obtenir le nombre de fichiers dans le répertoire pointé par le chemin?


5 commentaires

Avez-vous essayé l'exemple de didacticiel Simple_LS: Boost.org/ DOC / LIBS / 1_41_0 / LIBS / Système de fichiers / Exemple / Simple_Ls. CPP Comment ne répond pas à vos besoins?


Recursivement ou juste dans le répertoire d'un?


Avez-vous lu sur la répertoire itérateur? boost.org/doc/ LIBS / 1_36_0 / LIBS / Systèmes de fichiers / Doc / ...


Dupliqué possible de C ++ - Chargez tout le nom de fichier + Comptez le nombre de fichiers dans un répertoire actuel + une extension de fichier de filtre


@Gabe n'est pas récursivement, mais c'est aussi intereseting. @Krill j'ai cherché quelque chose de spécifique à booster mais n'a pas trouvé celui-ci. J'ai fait une recherche et tout!


3 Réponses :


7
votes
directory_iterator begin(the_path), end;
int n = count_if(begin, end,
    [](const directory_entry & d) {
        return !is_directory(d.path());
});

5 commentaires

Cela comptera le nombre de tous les éléments, y compris des sous-répertoires, pas seulement des fichiers.


@Kirill: Cela n'aurait même pas fait cela avant que je le répète. :)


@Kirill: ça? Oui. Qu'est-ce que j'avais auparavant? Non.


Oh .. la page n'a pas rafraîchi :)


(pH = boost :: phénix) pH :: logical_not (pH :: lid (& is_directory, pH :: Bindry :: chemin, arg1))) doit le faire



11
votes

Vous pouvez parcourir des fichiers dans un répertoire avec: xxx

ou récursivement: xxx

Vous pouvez trouver des exemples simples ici .


0 commentaires

12
votes

Voici une doublure en standard C ++:

#include <iostream>
#include <boost/filesystem.hpp>
#include <boost/lambda/bind.hpp>

int main()
{
    using namespace boost::filesystem;
    using namespace boost::lambda;

    path the_path( "/home/myhome" );

    int cnt = std::count_if(
        directory_iterator(the_path),
        directory_iterator(),
        static_cast<bool(*)(const path&)>(is_regular_file) );

    // a little explanation is required here,
    // we need to use static_cast to specify which version of
    // `is_regular_file` function we intend to use
    // and implicit conversion from `directory_entry` to the
    // `filesystem::path` will occur

    std::cout << cnt << std::endl;

    return 0;
}


4 commentaires

+1. Mais, pourquoi pas seulement utiliser int cnt = stdd :: comte_if (répertoire_iterator (the_path), répertoire_iterator (), static_cast (is_regular_file)); ?


@xmllmx bonne note. Bien sûr, vous pouvez passer le répertoire sur la fonction autonome is_regular_file fonction. Et l'appel de annuaire_entry :: chemin () se produira implicitement. Je vais mettre à jour la réponse.


one-liner en standard c ++ ??? Ressemble à une doublure dans Boost qui n'est pas standard C ++.


@CRAIGB One-Line est STD :: comte_if. Boost a été utilisé ici uniquement parce que OP a posé des questions sur Boost :: FileSystem :: Path.