рекурсивный список файлов каталогов с помощью boost :: filesystem

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

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

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

2

Решение

Вы увеличиваете rdi внутри цикла, а также в for объявление:

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

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

5

Другие решения

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

recursive_directory_iterator dir(path(Dir));
for(auto&& i : dir) {
if (is_directory(i)) {
//Do whatever you want
cout << i << endl;
}
}
1