Salut à tous!
J'essaye de me faire pleins de petits bouts de codes pour recréer un peu les commandes de bases servant à jouer avec les dossiers/fichiers. Je suis sous linux et je programme à l'aide de boost::filesystem v3 et de la stl (GNU).

Comme la "commande" ls pourrait être utilisée, par exemple, récursivement dans tout plein de dossiers contenus dans un vector, je me suis dit qu'il serait bien d'en faire un foncteur. En gros, il faut que ce code soit simple, bullet proof et utilisable partout à toutes les sauces. Qu'en pensez-vous?
Ps. Jsuis pas un professionnel

Voici donc le code :
ls.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
#pragma once
 
#include <sstream>
#include <memory>
#include <algorithm>
#include <iterator>
#include <boost/filesystem.hpp>
 
class ls
{
    public:
 
    ls(const boost::filesystem::path &path = "."): path_(path){
    }
 
    //Envoye le chemin de tout ce qui se trouve à path_ sur un stream
    std::auto_ptr<std::istringstream> operator()() const{
        std::ostringstream oss; 
 
        //See boost tut3 for details in section tutorial of boost::filesystem
        //v3
        std::copy(boost::filesystem::directory_iterator(path_),
                boost::filesystem::directory_iterator(), 
                std::ostream_iterator<boost::filesystem::directory_entry>(oss,"\t") );
 
        return std::auto_ptr<std::istringstream>(new std::istringstream(oss.str()));
                //then wtf about the streambuf?
    }
    private:
    const boost::filesystem::path path_;
};
main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
#include <iostream>
#include <boost/filesystem.hpp>
#include "ls.hpp"
 
using namespace std;
using namespace boost::filesystem;
 
int main(int argc, char *argv[])
{
    path p;
    (argc == 1)?p = "." : p = argv[1];
    ls l(p);
 
    istream is(l()->rdbuf());
    string buf;
    while(!is.eof())
    {
        is >> buf;
        cout << buf << endl;
    }
 
 
    return 0;
}
Compilé avec g++ main.cpp -o ls -lboost_filesystem
Tout marche bien du point de vue utilisateur.