C ++ Как использовать std :: filesystem :: directory_options - PullRequest
0 голосов
/ 09 октября 2019

Общее количество noob здесь, поэтому заранее извиняюсь, если это рассматривается где-то еще, но я не нахожу подходящий пример в Google где-либо и где-либо еще.

Я использую std :: filesystem :: recursive_directory_iteratorходить по дереву каталогов. Когда я получаю каталог, на который у меня нет разрешения, он выдает исключение. Я понимаю, что std :: filesystem :: directory_options - это то, что я хочу, чтобы иметь возможность пропустить запрещенное разрешение и не следовать символическим ссылкам;но я не уверен, как его использовать.

По сути, мне нужно пройтись по дереву каталогов (которое может быть довольно большим);пропуск любых разрешенных разрешенных каталогов и не следующих символических ссылок. Если в каждом каталоге есть какие-либо файлы любого типа, этот каталог добавляется в очередь для последующего использования.

Ниже приведен фрагмент кода.

Спасибо.

for (auto& dirent : std::filesystem::recursive_directory_iterator(start_path))
{
    if (dirent.is_directory())
    {
        // CRASH if permission denied; need std::filesystem::options
        std::filesystem::path fsp = dirent.path();
        for (auto& subdirent : std::filesystem::directory_iterator(fsp))
        {
            if (!subdirent.is_directory())
            {
                dir_stack.push_back(dirent.path());
                break;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Спасибо, ребята, за то, что направили меня в правильном направлении. Немного больше копания и много проб и ошибок, и я получил это. Я надеюсь, что этот код правильный, он делает то, что я хочу! И да, я знаю, что я могу сделать некоторые сокращения, чтобы сократить утверждения, но моя память не так хороша :) Еще раз спасибо!

const std::filesystem::directory_options options = (
    std::filesystem::directory_options::follow_directory_symlink |
    std::filesystem::directory_options::skip_permission_denied
);

    try
    {
        for (const auto& dirent :
            std::filesystem::recursive_directory_iterator(start_path,
            std::filesystem::directory_options(options)))
        {
            …
        }
    catch(std::filesystem::filesystem_error &fse)
    {
        std::cout << "Caught fatal exception: "
            << std::endl
            << fse.what()
            << std::endl;
    }
0 голосов
/ 09 октября 2019

Я отредактировал код:

   for (auto& dirent : std::filesystem::recursive_directory_iterator(start_path))
{
    if (dirent.is_directory())
    {
        // CRASH if permission denied; need std::filesystem::options
        std::filesystem::path fsp = dirent.path();
        for (auto& subdirent : std::filesystem::directory_iterator(fsp))
        {
            if (!subdirent.is_directory()&& !is_symlink(subdirent) && (fs::status(subdirent).permissions() ==  fs::perms::owner_all | fs::perms::group_all))
            {
                dir_stack.push_back(dirent.path());
                break;
            }
        }
    }
}
...