std::experimental::filesystem::recursive_directory_iterator пропустить папку и ее подпапку

Мне нужно рекурсивно искать файлы в одном каталоге и его подкаталоге, но я хочу исключить из поиска один путь (с его файлами и подкаталогом).

Я использую модификаторы std::experimental::filesystem::recursive_directory_iterator и pop(), но это не работает. Где я не прав?

void search(const char* pathToSearch,const char* pathToExclude){        
    std::experimental::filesystem::recursive_directory_iterator iterator(pathToSearch);
    for (auto& p : iterator) {
        if (p.path() == std::experimental::filesystem::directory_entry(pathToExclude).path()) iterator.pop();
        if (fs::is_directory(p)) continue; //exclude directory from output
        else std::cout << p << std::endl;
    }
}

person gimiki    schedule 18.12.2017    source источник


Ответы (1)


Во-первых, цикл for на основе диапазона работает со скрытой копией iterator, а не с самим iterator. Если вам нужно манипулировать итератором, используемым для итерации, вам нужен обычный for:

for(decltype(iterator) end; iterator != end; ++iterator) {
   // ...
}

Во-вторых, pop означает "подняться на один уровень вверх", но когда вы сравнили iterator->path() с исключенным путем, ваша итерация не спустилась в каталог, поэтому pop не будет работать правильно. Вместо этого используйте disable_recursion_pending.

person T.C.    schedule 18.12.2017