2013-04-12 67 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 –