C++ 递归目录迭代器引发异常

C++ 递归目录迭代器引发异常,c++,boost,c++11,C++,Boost,C++11,我使用boost迭代器“recursive_directory_iterator”递归地扫描目录。但是,当迭代器运行到我的应用程序无权访问的目录中时,会抛出类型为“boost::filesystem3::filesystem_error”的异常,这将停止迭代器,程序将中止。无论如何,我可以指示迭代器跳过这些目录 我尝试了当时建议的代码,但是,它对我来说不起作用。我使用的是boost版本1.49 我的代码在遵循建议(我能想到的最好的建议)后如下所示: void scand() { boos

我使用boost迭代器“recursive_directory_iterator”递归地扫描目录。但是,当迭代器运行到我的应用程序无权访问的目录中时,会抛出类型为“boost::filesystem3::filesystem_error”的异常,这将停止迭代器,程序将中止。无论如何,我可以指示迭代器跳过这些目录

我尝试了当时建议的代码,但是,它对我来说不起作用。我使用的是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;
    }
}
void scand()
{
boost::system::错误代码ec,无错误;
//读目录内容递归
for(递归目录迭代器结束,路径(“/tmp”,ec);
_路径!=结束;_路径增量(ec)){
如果(ec!=无错误){
_path.pop();
继续;
}

cout path()您可以使用try-catch块,如果捕获boost::filesystem3::filesystem\u错误,则可以跳过当前迭代:

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++;
   }
}
void scand()
{
boost::system::错误代码ec,无错误;
//读目录内容递归
递归目录迭代器结束;
_路径(“/tmp”,ec);
while(_path!=end){
尝试
{
如果(ec!=无错误){
_path.pop();
继续;
}

cout path()这是boost::filesystem(V3)中的一个已知错误。根据您的需要,您可以使用该库的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;
  }
}
boost::system::error\u code ec;
std::deque目录{initialDir};
而(!directories.empty())
{
boost::filesystem::directory_迭代器dit(directories.front(),ec);
目录。pop_front();
while(dit!=boost::filesystem::directory\u iterator())
{
if(boost::filesystem::is_目录(dit->path(),ec))
{
目录。向后推(dit->path());
}
HandleFile(dit->path());//来构建。如果您既没有
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(...)
        {}
名称空间fs=std::实验::文件系统;
对于(std::deque目录{{stru_to(path)}};!directories.empty();directories.pop_front())
试一试{
对于(fs::directory_iterator dit(directories.front());dit!=fs::directory_iterator();++dit)
if(fs::is_目录(dit->path())
目录。向后推(dit->path());
else if(fs::is_regular_file(dit->path()))
句柄(dit->path().string());
}
捕获(…)
{}

我更新了for循环的增量部分,现在我得到一个不同的错误:****内部程序错误-断言(m_级别>0)在void boost::filesystem3::detail::recur_dir_itr_imp::pop():/usr/include/boost/filesystem/v3/operations.hpp(818):pop()在递归级别为1的迭代中,这是一个已知的(尚未修复的)错误:我有同样的问题。在2015年4月还没有固定。我是C++的新手,但是如何在Afor循环中使用一个TestCcatch块来进行语句。我猜一个选项是将for循环变成while循环。我会尝试一下。