2013-12-12 3 views
2

Я хочу получить все файлы внутри конкретной папки (в данном случае Documents) с Boost Filesystem в Windows.Фильтрация папок в файловой системе Boost

Для этого я создаю фильтр, чтобы гарантировать, что у меня нет папок.

Проблема заключается в том, что, когда я все еще получаю следующие папки:

"C:\....\Documents\My Videos", 
"C:\....\Documents\My Music", 
"C:\....\Documents\My Pictures" 

(я не получить некоторые другие папки)

Код следующее:

boost::filesystem::directory_iterator end; 
for (boost::filesystem::directory_iterator iter(documentsFolder); iter != end; ++iter){ 
    if (!is_directory(*iter)){ 
     std::cout << iter->path() << "\n"; 
    } 
    else{ 
     std::cout << "-------->>>" << iter->path() << "\n"; 
    } 

Есть ли способ избежать этих папок без ручной фильтрации?

Большое спасибо!

+2

Арен» т эти символические ссылки? –

+1

Они могут быть ссылками на имя пользователя/изображения или что-то еще. вы также можете распечатать этот тип, а также указать путь к тому, что, по сути, думает система boost. – 111111

+0

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

ответ

2

Это, вероятно, соединения.

Я просто попытался его на коробке окна с помощью junction.exe (от Sysinternals), чтобы сделать точку перехода, и использовать эту небольшую программу испытаний, чтобы определить их:

#include <boost/range/iterator_range.hpp> 
#include <boost/filesystem.hpp> 
#include <vector> 
#include <string> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    using namespace boost::filesystem; 
    std::vector<std::string> args(argv+1, argv+argc); 
    if (args.empty()) args.push_back("C:\\WORK"); 

    for (auto dir : args) 
    { 
     recursive_directory_iterator f(dir), l; 
     for (directory_entry& entry : boost::make_iterator_range(f,l)) 
     { 
      if (is_other(entry)) 
      { 
       assert(!is_regular_file(entry)); 
       assert(!is_directory(entry)); 
       std::cout << entry << "\n"; 
      } 
     } 
    } 
} 

Теперь работает это с test.exe "C:\WORK" распечатанный

"C:\WORK\MyJunction" 

Обратите внимание, что assers доказать, что является ни обычным файлом, ни каталог.


В несколько несвязанных новостях, это довольно сладкая для каталога итерации:

int main(int argc, char* argv[]) 
{ 
    using namespace boost::adaptors; 

    std::vector<std::string> const args(argv+1, argv+argc); 

    for (auto& dir : args) 
     for (auto& entry : traverse_directory(dir) | filtered(is_valid_file)) 
      std::cout << entry << "\n"; 
} 

Используя эти довольно простые хелперы:

template <typename T> 
boost::iterator_range<boost::filesystem::recursive_directory_iterator> traverse_directory(T const& dir) { 
    boost::filesystem::recursive_directory_iterator f(dir), l; 
    return boost::make_iterator_range(f, l); 
} 

static bool is_valid_file(boost::filesystem::directory_entry const& entry) { 
    return is_regular_file(entry) && !is_other(entry); 
} 

Посмотреть Live on Coliru

+0

выглядит довольно круто, посмотрит как можно скорее. Большое спасибо :) – user3009804

+0

Конечно, синтаксический сахар предполагает, что у вас есть поддержка C++ 11 (например, я тестировал на MSVC12 == VS2013) – sehe

Смежные вопросы