2013-12-12 1 views
2

Windows의 모든 파일을 Boost Filesystem과 함께 구체적인 폴더 (이 경우 Documents)에 가져 오려고합니다.부스트 파일 시스템의 폴더 필터링

이 경우 필터를 만들어 폴더가 없음을 확인합니다.

boost::filesystem::directory_iterator end; 
for (boost::filesystem::directory_iterator iter(documentsFolder); iter != end; ++iter){ 
    if (!is_directory(*iter)){ 
     std::cout << iter->path() << "\n"; 
    } 
    else{ 
     std::cout << "-------->>>" << iter->path() << "\n"; 
    } 

:

"C:\....\Documents\My Videos", 
"C:\....\Documents\My Music", 
"C:\....\Documents\My Pictures" 

(내가하지 않는 일부 다른 폴더)

코드는 다음과 같다 :

문제는 내가 아직 다음 폴더를 얻을 때이다 수동 필터링을하지 않고도이 폴더를 피할 수있는 방법이 있습니까?

고맙습니다.

+2

때로 믿을 수 ' 그 것들을 상징적 인 링크로 보지 않으시겠습니까? –

+1

그들은 사용자 이름/그림 등의 링크 일 수 있습니다. 파일 시스템이 실제로 그것이 무엇이라고 생각 하는지를 알 수있는 경로뿐만 아니라 타입을 출력 할 수있다. – 111111

+0

파일 형식을 늘리려고 시도합니다. 파일 시스템이 그렇다고 생각합니다. 어쨌든 이러한 폴더를 피하기 위해 수행 한 작업은이 폴더에 크기 속성이 없으므로 파일 크기를 묻는 시도입니다 – user3009804

답변

2

이것은 가능한 접합점입니다. 이제 test.exe "C:\WORK" 이것을 실행

#include <boost/range/iterator_range.hpp> 
#include <boost/filesystem.hpp> 
#include <vector> 
#include <string> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    using namespace boost::filesystem; 
    std::vector<std::string> args(argv+1, argv+argc); 
    if (args.empty()) args.push_back("C:\\WORK"); 

    for (auto dir : args) 
    { 
     recursive_directory_iterator f(dir), l; 
     for (directory_entry& entry : boost::make_iterator_range(f,l)) 
     { 
      if (is_other(entry)) 
      { 
       assert(!is_regular_file(entry)); 
       assert(!is_directory(entry)); 
       std::cout << entry << "\n"; 
      } 
     } 
    } 
} 

인쇄

:

난 그냥 연결 지점을 만들기 위해 (시스 인 터널에서) junction.exe를 사용하여, 그들을 찾아 낼이 작은 테스트 프로그램을 사용하여 Windows 상자에 그것을 시도

"C:\WORK\MyJunction" 

assers은 일반 파일이 아니고 디렉토리가 아닙니다. 이 비교적 간단 도우미

int main(int argc, char* argv[]) 
{ 
    using namespace boost::adaptors; 

    std::vector<std::string> const args(argv+1, argv+argc); 

    for (auto& dir : args) 
     for (auto& entry : traverse_directory(dir) | filtered(is_valid_file)) 
      std::cout << entry << "\n"; 
} 

사용 : 약간 관련이없는 뉴스에서


, 이것은 디렉토리 반복 오히려 달콤한 참조

template <typename T> 
boost::iterator_range<boost::filesystem::recursive_directory_iterator> traverse_directory(T const& dir) { 
    boost::filesystem::recursive_directory_iterator f(dir), l; 
    return boost::make_iterator_range(f, l); 
} 

static bool is_valid_file(boost::filesystem::directory_entry const& entry) { 
    return is_regular_file(entry) && !is_other(entry); 
} 

그것을 Live on Coliru

+0

는 매우 서늘 해 보이고 최대한 빨리 보일 것입니다. 대단히 감사합니다 :) – user3009804

+0

물론 구문 설탕은 C++ 11을 지원한다고 가정합니다 (예 : MSVC12 == VS2013에서 테스트). – sehe

관련 문제