C ++, имитирующие команды ls like - PullRequest
3 голосов
/ 11 мая 2010

Как реализовать ls "filename_ [0-5] [3-4]?" как класс? Результат, который я хотел бы сохранить в векторе .

В настоящее время я использую system () , которая вызывает ls , но это не переносимо для MS.

спасибо, Арман.

Ответы [ 3 ]

5 голосов
/ 11 мая 2010

Следующая программа перечисляет файлы в текущем каталоге, чье имя соответствует регулярному выражению 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;
}

Для краткости я опустил определение transform_if(). Это не стандартная функция, но ее реализация должна быть простой.

2 голосов
/ 11 мая 2010

Вы можете использовать boost :: filesystem, которая имеет переносимый способ извлечения файлов в каталоге.

Затем вы можете проверить файлы по регулярному выражению, например, с помощью boost :: regex, чтобы сохранить только те, которые соответствуют вашему шаблону.

0 голосов
/ 11 мая 2010

Решение для повышения является портативным, но не оптимальным для Windows. Причина в том, что он вызывает FindFirstFile("*.*") и, таким образом, возвращает все. Учитывая шаблон сглаживания, было бы более эффективно вызвать FindFirstFile("filename_?*.*"). Вам все равно придется отфильтровать результаты (используя, например, Boost :: regex), но это исключит множество файлов, которые могут не совпадать.

Кроме того, используя любой из этих методов, не забудьте отфильтровать каталоги перед сопоставлением с регулярным выражением. Проверить, является ли запись каталогом, довольно дешево.

...