Recursive_directory_iterator抛出异常
recursive_directory_iterator throws exception
我使用boost迭代器"recursive_directory_iterator"递归扫描目录。但是,当迭代器运行到一个我的应用程序无法访问的目录时,抛出类型为"boost::filesystem3::filesystem_error"的异常,该异常会停止迭代器并终止程序。有没有办法让迭代器跳过这样的目录?
我尝试了在使用boost::filesystem遍历目录而不抛出异常时建议的代码,但是,它对我不起作用。我正在使用boost 1.49版本。
按照建议(我能想到的最好的)之后,我的代码如下:
void scand()
{
boost::system::error_code ec, no_err;
// Read dir contents recurs
for (recursive_directory_iterator end, _path("/tmp", ec);
_path != end; _path.increment(ec)) {
if (ec != no_err) {
_path.pop();
continue;
}
cout << _path->path() << endl;
}
}
谢谢你,艾哈迈德。
这是boost::filesystem (V3): https://svn.boost.org/trac/boost/ticket/4494中的一个已知错误。根据您的需要,您可以使用库的V2版本(它甚至可以以std::tr2::filesystem
的形式与编译器一起提供)。另一个选择是自己实现递归部分。
boost::system::error_code ec;
std::deque<boost::filesystem::path> directories {initialDir};
while(!directories.empty())
{
boost::filesystem::directory_iterator dit(directories.front(), ec);
directories.pop_front();
while(dit != boost::filesystem::directory_iterator())
{
if(boost::filesystem::is_directory(dit->path(), ec))
{
directories.push_back(dit->path());
}
HandleFile(dit->path()); // <-- do something with the file
++dit;
}
}
上面的代码只是给了一个大致的概念,错误检查和其他功能是缺失的。
你可以使用try-catch块,如果你捕获了boost::filesystem3::filesystem_error,那么你可以跳过当前的迭代:
void scand()
{
boost::system::error_code ec, no_err;
// Read dir contents recurs
recursive_directory_iterator end;
_path("/tmp", ec);
while (_path != end) {
try
{
if (ec != no_err) {
_path.pop();
continue;
}
cout << _path->path() << endl;
}
catch(boost::filesystem3::filesystem_error e)
{
}
_path++;
}
}
以andreas的回答为基础。如果你既没有std::experimental
v2也没有boost
,试试这个。它会跳过有问题的文件夹。
namespace fs = std::experimental::filesystem;
for(std::deque<fs::path> directories{{str_to<std::string>(path)}} ; ! directories.empty() ; directories.pop_front())
try {
for(fs::directory_iterator dit(directories.front()) ; dit != fs::directory_iterator() ; ++dit)
if (fs::is_directory(dit->path()))
directories.push_back(dit->path());
else if (fs::is_regular_file(dit->path()))
Handle(dit->path().string());
}
catch(...)
{}
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 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 抛出异常
- 如果文件为c ,如何抛出异常