Обход каталога с помощью boost :: filesystem без исключения

У меня есть путь к каталогу, и я хочу пройти через все его подкаталоги, собирая между прочим пути файлов.

namespace fs = boost::filesystem;

std::vector<fs::path> traverse_if_directory(fs::path& f) {
std::vector<fs::path> result;
if (fs::is_directory(f)) {
for (fs::recursive_directory_iterator it(f), eit; it != eit; ++it) {
if (!fs::is_directory(it->path())) {
result.push_back(it->path());
}
}
}
else {
result.push_back(f);
}

return result;
}

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

Но как мне это сделать?

5

Решение

Ха, разобрался, есть способ

std::vector<fs::path> traverse_if_directory(fs::path& f) {
std::vector<fs::path> result;
boost::system::error_code ec;

if (fs::is_directory(f)) {
for (
fs::recursive_directory_iterator it(f, ec), eit;
it != eit;
it.increment(ec)
) {
if (ec) {
it.pop();
continue;
}
if (!fs::is_directory(it->path())) {
result.push_back(it->path());
}
}
}
else {
result.push_back(f);
}

return result;
}

Существует неперерабатывающая перегрузка, которая принимает выходной параметр типа boost::system::error_code, так что я могу просто проверить после каждого приращения, если были какие-либо ошибки.

8

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

Ответ Joker_vD вылетает, когда возникает ошибка для последней записи в каталоге. Например, когда целевой каталог содержит один подкаталог без разрешений. Причиной является ‘it.pop ()’, который явно не нужен. Кроме того, «продолжить» не следует делать, так как это пропустит следующую запись. После ошибки итератор уже указывает на следующую допустимую запись или равен конечному итератору.

Это исправленная версия:

std::vector<fs::path> traverse_if_directory(const fs::path& f) {
std::vector<fs::path> result;
boost::system::error_code ec;

if (fs::is_directory(f)) {
for (fs::recursive_directory_iterator it{f, ec}, end; it != end; it.increment(ec)) {
if (!fs::is_directory(it->path())) {
result.push_back(it->path());
}
}
}
else {
result.push_back(f);
}

return result;
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector