使用boost::filesystem遍历目录而不抛出异常
Traversing a directory with boost::filesystem without throwing exceptions
我有一个目录的路径,我想遍历它的所有子目录,顺便收集文件的路径。
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;
}
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 在0x5914F3BE抛出异常(基于.dll)
- std::vector 默认构造函数可以抛出异常吗?
- 挂钩创建文件抛出异常:读取访问冲突
- getaddrinfo 抛出异常
- 使用boost::filesystem遍历目录而不抛出异常