2013-03-03 1 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 

. 어떤 시도를 할 수 있습니까? 당신은 루프 내에서 rdi를 증가하는

+0

나는 모든하지만 부스트 :: 파일 시스템과 협력하지 않은를 end_rdi에 아무 것도 지정해서는 안됩니까? – dutt

+1

@dutt 아니요, 기본 생성자는 end iterator [(docs)] (http://www.boost.org/doc/libs/1_50_0/libs/filesystem/doc/reference.html#Class- recursive_directory_iterator),'std :: istream_iterator ' –

+0

아아, 괜찮아. – dutt

답변

5

사전에 어떤 도움뿐만 아니라 for 선언 감사 :

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

rdiend_rdi (과거 의미 최종 반복자가 될 수 있음을 의미 마지막 요소). 네가 이러는 이유가 있니? (이것은 의도적 인 경우에, 당신은 당신이 그것을 증가 후 다시 확인 rdi != end_rdi을 확인해야합니다.)

+0

hix !! 내 프로그래밍 오류입니다. 고맙습니다! –

1

는이 같은 시도 할 수 :

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