Исключение std :: filesystem :: recursive_directory_iterator

Следующая функция:

void foo(const std::string& dir)
{
    for (auto& el : std::filesystem::recursive_directory_iterator(dir)) {
            std::cout << el.path() << '\n';
    }
}

при использовании в:

int main()
{
    std::string p = "C:\\";
    foo(p);
}

вызывает исключение, когда достигает определенной папки (я предполагаю) в Windows 10. Код компилируется на VS 2017 с поддержкой C++ 17. Сообщение об исключении:

recursive_directory_iterator::operator++: The system cannot find the path specified.

То же самое происходит и при использовании std::filesystem::directory_iterator. Почему возникает исключение для этой конкретной папки?

У вас есть папка Документы и настройки в Windows 10?

NathanOliver 13.09.2018 18:50

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

drescherjm 13.09.2018 18:50

Если бы Windows 10 была обновлена ​​с Windows 7, это могло быть остаточной точкой соединения.

Eljay 13.09.2018 18:52

@Eljay Windows 7 также имеет папку пользователя. IIRC Windows XP последней имела папку Документы и настройки.

NathanOliver 13.09.2018 18:53

@NathanOliver • В XP была папка «Документы и настройки». Windows 7 использовала точку пересечения для обратной совместимости с приложениями эпохи XP. (Почему никто больше не говорит о Vista? Lol)

Eljay 13.09.2018 19:01

FWIW, у меня тоже есть исключение, скорее всего, другая папка, чем у вас, но: Unhandled exception at 0x7720DDC2 in Test.exe: Microsoft C++ exception: std::filesystem::filesystem_error at memory location 0x00F9F63C. occurred.

NathanOliver 13.09.2018 19:18

@NathanOliver Верно. Я обновил вопрос.

Ron 14.09.2018 10:37

@drescherjm Я безрезультатно пробовал "Запуск от имени администратора". Исключение сохраняется.

Ron 14.09.2018 10:40

@drescherjm Я с вами согласен. Должна быть проблема с привилегиями. Я могу подтвердить, что не могу перебирать весь Windows _folder, пока я могу через _Program Files (x86)

Ron 14.09.2018 10:53
4
9
2 674
1

Ответы 1

Видимо, возникает исключение, когда ОС запрещает доступ к одной из папок.

Обходной путь - использовать соответствующую перегрузку конструктора рекурсивный итератор каталогов (4-й) и указать параметр skip_permission_denied:

for (auto& el : std::filesystem::recursive_directory_iterator(dir, std::filesystem::directory_options::skip_permission_denied)) {
    std::cout << el.path() << '\n';
}

К сожалению, fs::recursive_directory_iterator(".", fs::directory_options::follow_directory_symlink | fs::directory_options::skip_permission_denied) все еще может аварийно завершить работу с тем же исключением, например. в неродных файловых системах (например, ext2) с именами файлов, которые содержат символы, недопустимые для собственного Windows API.

Sz. 25.07.2019 22:26

Этого не достаточно. Например, «C: \ PerfLogs» - 777, но система не позволяет обычному пользователю видеть его содержимое. Похоже, есть еще один уровень "разрешений" с NTFS / Windows.

Salamandar 26.10.2019 13:01

Другие вопросы по теме