使用boost::filesystem遍历目录而不抛出异常

Traversing a directory with boost::filesystem without throwing exceptions

本文关键字:抛出异常 遍历 boost filesystem 使用      更新时间:2023-10-16

我有一个目录的路径,我想遍历它的所有子目录,顺便收集文件的路径。

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;
}

不幸的是,在遍历过程中,我偶然发现了一个我无权查看的目录,上面的代码抛出了错误。但显然,在这种情况下,这不是一个例外,我应该继续,跳过这个锁定的目录。

但是我该怎么做呢?

哈,想出来了,有个办法:

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类型的输出参数,所以我可以在每次递增后检查是否有任何错误。

Joker_vD的答案在最后一个目录条目出现错误时崩溃。例如,当目标目录包含一个没有权限的子目录时。原因是显然不需要的'it.pop()'。此外,"continue"也不应该执行,因为它会跳过下一个条目。发生错误后,迭代器已经指向下一个有效条目,或者等于结束迭代器。

这是更正后的版本:

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;
}