C++ 使用boost::filesystem遍历目录而不引发异常

C++ 使用boost::filesystem遍历目录而不引发异常,c++,boost,boost-filesystem,C++,Boost,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_

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

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;
}
namespace fs=boost::filesystem;
std::vector遍历目录(fs::path&f){
std::向量结果;
如果(fs::is_目录(f)){
对于(fs::递归目录迭代器it(f),eit;it!=eit;++it){
如果(!fs::is_目录(it->path()){
结果:向后推(it->path());
}       
}
}
否则{
结果:推回(f);
}
返回结果;
}
不幸的是,在遍历过程中,我偶然发现了一个目录,我没有权限查看,上面的代码抛出了。但是很明显,在这个场景中,这不是一个例外,我应该继续,跳过这个锁定的目录


但是我该怎么做呢

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

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;
}
std::vector traverse\u if\u目录(fs::path&f){
std::向量结果;
boost::system::error_code ec;
如果(fs::is_目录(f)){
为了(
递归目录迭代器it(f,ec),eit;
它!=eit;
it.增量(ec)
) {
国际单项体育联合会(欧共体){
it.pop();
继续;
}
如果(!fs::is_目录(it->path()){
结果:向后推(it->path());
}
}
}
否则{
结果:推回(f);
}
返回结果;
}

有一个非抛出重载,它接受类型为
boost::system::error\u code
的输出参数,因此我可以在每次递增后检查是否有任何错误。

当最后一个目录条目发生错误时,Joker\u 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;
}
std::vector traverse\u if\u目录(const fs::path&f){
std::向量结果;
boost::system::error_code ec;
if(fs::is_目录(f)){
对于(fs::recursive_directory_iterator it{f,ec},end;it!=end;it.increment(ec)){
如果(!fs::is_目录(it->path()){
结果:向后推(it->path());
}
}
}
否则{
结果:推回(f);
}
返回结果;
}

关于。。。捕获异常?捕获异常时我该怎么做?此时迭代器将被销毁,我无法从
catch
子句中继续迭代!在遍历目录之前检查目录的权限,如果没有权限则忽略它显然
boost::filesystem::recursive\u directory\u iterator
(当使用boost filesystem的V3时)中有一个bug,因此即使使用了无抛出版本,它也确实会抛出:很好,正是我所需要的。几年前我偶然发现了同样的问题。