3 votes

C++ imitant ls comme commandes

Comment implémenter la commande "ls 'nom_de_fichier_[0-5][3-4]?" comme une classe? Le résultat que je voudrais stocker dans le vector.

Actuellement, j'utilise system() qui appelle ls, mais ce n'est pas portable sous MS.

merci, Arman.

5voto

wilhelmtell Points 25504

Le programme suivant répertorie les fichiers dans le répertoire actuel dont le nom correspond à l'expression régulière filename_[0-5][34] :

#include <boost/filesystem.hpp>
#include <boost/regex.hpp>  // also functional,iostream,iterator,string
namespace bfs = boost::filesystem;

struct match : public std::unary_function<bfs::directory_entry,bool> {
    bool operator()(const bfs::directory_entry& d) const {
        const std::string pat("filename_[0-5][34]");
        std::string fn(d.filename());
        return boost::regex_match(fn.begin(), fn.end(), boost::regex(pat));
    }
};

int main(int argc, char* argv[])
{
    transform_if(bfs::directory_iterator("."), bfs::directory_iterator(),
                 std::ostream_iterator<std::string>(std::cout, "\n"),
                 match(),
                 mem_fun_ref(&bfs::directory_entry::filename));
    return 0;
}

J'ai omis la définition de transform_if() pour des raisons de concision. Ce n'est pas une fonction standard mais elle devrait être simple à implémenter.

2voto

Nikko Points 2009

Vous pouvez utiliser boost::filesystem qui offre un moyen portable de récupérer des fichiers dans un répertoire.

Ensuite, vous pouvez vérifier les fichiers par rapport à une expression régulière avec boost::regex par exemple pour ne conserver que ceux qui correspondent à votre motif.

0voto

MSalters Points 74024

La solution d'optimisation est portable, mais pas optimale sur Windows. La raison en est qu'elle appelle FindFirstFile("*.*") et retourne donc tout. Étant donné le modèle de correspondance, il serait plus efficace d'appeler FindFirstFile("filename_?*.*"). Vous devriez toujours filtrer les résultats (en utilisant par exemple Boost::regex), mais cela exclurait de nombreux fichiers qui ne pourraient pas correspondre.

De plus, en utilisant l'une ou l'autre méthode, n'oubliez pas de filtrer les répertoires avant de procéder à la correspondance regex. Vérifier si une entrée est un répertoire est assez bon marché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X