2013-04-12 45 views
4

我有一个目录路径,我想遍历它的所有子目录,顺便收集文件的路径。使用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_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; 
} 

不幸的是,在穿越的中间,我偶然发现了一个目录,我没有权利来看待,而上面的代码抛出。但显然,在这种情况下,它不是一个例外,我应该继续,跳过这个锁定的目录。

但我该怎么做?

+2

怎么样...捕捉异常? – PlasmaHH

+0

当我抓到它时该怎么办?此时迭代器已经被销毁了,我不能从'catch'子句中继续迭代! –

+1

在遍历它之前检查目录的权限,如果你没有权限就忽略它[link](http://stackoverflow.com/questions/9776050/how-to-get-file-permissions-with-c-boost-库) – ldgorman

回答

6

哈,想通了,还有一个办法:

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类型的输出参数,所以我每次递增后只检查是否有任何错误。

+2

显然,'boost :: filesystem :: recursive_directory_iterator'(当使用boost文件系统的V3时)存在一个错误,所以即使使用无抛出版本,它也会抛出:https://svn.boost .ORG/TRAC /升压/票/ 4494 –