2013-03-03 2 views
2

Я использую новый boost, v1.5.3, для выполнения этой задачи, как и после, благодаря классу recursive_directory_iterator (мне не нужно писать рекурсивный код):Реестр файлов каталога рекурсивно с boost :: filesystem

void ListDirRec(const char *Dir, vector<string>& DirFileList, const char* ext) 
{  
recursive_directory_iterator rdi(Dir); 
recursive_directory_iterator end_rdi; 

DirFileList.empty(); 

string ext_str0(ext); 
for (; rdi != end_rdi; rdi++) 
{ 
    rdi++; 
    //cout << (*di).path().string() << endl; 
    cout << (*rdi).path().string() << endl; 

    //cout << " <----- " << (*rdi).path().extension() << endl; 

    //string ext_str1 = (*rdi).path().extension().string(); 
    if (ext_str0.compare((*rdi).path().extension().string()) == 0) 
    { 
     DirFileList.push_back((*rdi).path().string()); 
    } 
} 

файлы списка функций с определенным расширением. Эта функция работает в тех случаях, но часто возвращают «утверждение не ошибка», как:

**** Internal program error - .... assertion (m_imp.get()) ... operations.hpp(952): dereference of end recursive_directory_iterator 

Я едва выяснить причину этой ошибки. Может ли кто-нибудь попробовать .. поймать помощь? заранее спасибо за любую помощь

+0

Я не работал с буст :: файловую систему на всех, но не следует ли назначать что-либо для end_rdi? – dutt

+1

@dutt нет, это нормально, конструктор по умолчанию возвращает в конце итератор [(docs)] (http://www.boost.org/doc/libs/1_50_0/libs/filesystem/doc/reference.html#Class- recursive_directory_iterator), так же, как 'std :: istream_iterator ' –

+0

А, ладно. – dutt

ответ

5

Вы увеличивающимся rdi внутри цикла, а также в for декларации:

for (; rdi != end_rdi; rdi++) 
{ 
    rdi++; 

Это означает, что rdi может быть end_rdi (конечный итератор, что означает, мимо последний элемент) внутри вашего цикла. Есть ли причина, по которой вы это делаете? (Если это намеренно, вы должны проверить, чтобы убедиться, что rdi != end_rdi снова после того, как вы увеличить его.)

+0

hix !! это моя ошибка программирования. Спасибо! –

1

Вы могли бы попробовать что-то вроде этого:

recursive_directory_iterator dir(path(Dir)); 
for(auto&& i : dir) { 
    if (is_directory(i)) { 
     //Do whatever you want 
     cout << i << endl; 
    } 
} 
Смежные вопросы