2013-03-03 75 views
2

我使用新的增強,v1.5.3,執行此任務如下,感謝類recursive_directory_iterator(我不必寫遞歸代碼):列表目錄文件遞歸與boost :: filesystem

void ListDirRec(const char *Dir, vector<string>& DirFileList, const char* ext) 
{  
recursive_directory_iterator rdi(Dir); 
recursive_directory_iterator end_rdi; 

DirFileList.empty(); 

string ext_str0(ext); 
for (; rdi != end_rdi; rdi++) 
{ 
    rdi++; 
    //cout << (*di).path().string() << endl; 
    cout << (*rdi).path().string() << endl; 

    //cout << " <----- " << (*rdi).path().extension() << endl; 

    //string ext_str1 = (*rdi).path().extension().string(); 
    if (ext_str0.compare((*rdi).path().extension().string()) == 0) 
    { 
     DirFileList.push_back((*rdi).path().string()); 
    } 
} 

具有特定擴展名的函數列表文件。此功能適用於案件但頻繁返回「斷言失敗錯誤」,如:

**** Internal program error - .... assertion (m_imp.get()) ... operations.hpp(952): dereference of end recursive_directory_iterator 

我幾乎找不出這個錯誤的原因。可以任何嘗試..趕上幫助? 在此先感謝您的幫助

+0

我還沒有與升壓::文件系統在工作,但所有你不應該分配任何東西給end_rdi嗎? – dutt 2013-03-03 06:45:23

+1

@dutt不,沒關係,默認的構造函數在結束迭代器[(docs)]中返回(http://www.boost.org/doc/libs/1_50_0/libs/filesystem/doc/reference.html#Class- recursive_directory_iterator),就像'std :: istream_iterator ' – 2013-03-03 06:51:00

+0

啊,那好吧。 – dutt 2013-03-03 07:12:41

回答

5

您遞增rdi循環內以及在for聲明:

for (; rdi != end_rdi; rdi++) 
{ 
    rdi++; 

這意味着,rdi可能是end_rdi(結束迭代器,這意味着過去最後一個元素)在你的循環中。你有這樣的理由嗎? (如果這是故意的,你應該檢查,以確保rdi != end_rdi你增加後再次它。)

+0

hix !!這是我的編程錯誤。謝謝! – 2013-03-03 07:56:19

1

你可以嘗試這樣的事:

recursive_directory_iterator dir(path(Dir)); 
for(auto&& i : dir) { 
    if (is_directory(i)) { 
     //Do whatever you want 
     cout << i << endl; 
    } 
}