我使用boost迭代器"recursive_directory_iterator“递归地扫描目录。但是,当迭代器运行到我的应用程序没有访问权限的目录时,会抛出"boost::filesystem3::filesystem_error“类型的异常,它会暂停迭代器并中止程序。有没有什么我可以指示迭代器跳过这样的目录。
我尝试了Traversing a directory with boost::filesystem without throwing exceptions上建议的代码,但它对我来说也不起作用。我使用的是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;
}
}
谢谢你艾哈迈德
发布于 2014-04-17 14:30:21
这是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;
}
}
上面的代码只是给出了一个大概的想法,错误检查和其他东西都是缺失的。
发布于 2013-04-19 09:14:26
您可以使用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++;
}
}
发布于 2019-12-24 14:00:21
在andreas的answer上构建。如果你既没有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(...)
{}
https://stackoverflow.com/questions/16101121
复制