2014-02-13 3 views
0

C++을 사용하여 특정 디렉토리에서 중복 파일을 제거하기위한 부스트 파일 시스템의 방법/접근 방법이 있습니까?부스트 파일 시스템을 사용하여 중복 파일을 제거하는 방법/접근법이 있습니까?

아래 코드를 사용하여 특정 디렉토리의 모든 파일을 검색했습니다. 이제 복제본을 찾아서 제거하고 싶습니다.

코드 부스트 파일 시스템을 사용하여 디렉토리에 재귀 적으로 파일을 나열하려면 :

void listFiles() 
{ 
fs::path sourceFolder; 
//SourceFolder 
std::cout<<"SourceFolder:"; 
std::cin>>sourceFolder; 

for(fs::recursive_directory_iterator it(sourceFolder), end_itr; it != end_itr; ++it) 
    { 
    if(!fs::is_regular_file(it->status())) 
     continue; 
    std::cout <<it->path().filename() <<endl; 
    } 
std::cout<<"Thanks for using file manager"; 
} 

사전에 감사합니다.

답변

0

아니요. 매우 구체적인 사용 사례이므로 코드를 직접 작성해야합니다.

기본적으로 최상의 절차는 3 단계 절차입니다. 먼저 크기별로 파일을 정렬하십시오. 다른 크기, 다른 파일. 둘째, 동일한 크기의 모든 파일에 대해 처음 4K를 읽고이를 비교하십시오 (작은 파일의 경우이 단계는 건너 뜁니다). 마지막으로, 처음 4K가 동일하면 전체 파일을 비교하십시오.

0

@MSalters는 이미이 문제에 접근하는 방법을 제시했습니다. 파일의 내용을 해시하고 동등한 해시를 비교하는 것이 좋습니다. 순전히 크기에 의존하는 것은 충분히 좋지 않을 수 있습니다. 해시를 비교하면 파일이 전체 파일 시스템에서 동일하다는 것을 알 수 있습니다.

+0

같은 이유로 중복> 2의 (많은) 세트를 필요로 예상 할 때. 결과를 저장하는 데 많은 시간이 걸리지는 않지만 해시가 고유하지 않기 때문에 ** 나중에도 전체 검사를 수행해야합니다. 따라서 잠재적 인 중복을 발견하면 전체 파일을 두 번 읽어야합니다. – MSalters

0

@murrekat @Malters는 이 아니며,은 단독으로 크기를 사용하는 것이 좋습니다. 대신, 대량의 데이터에 대해 해시를 생성하는 날을 살펴볼 수 있고 완료 될 때까지 오래된 것일 수 있으므로 크기 기준으로 잠재적 인 일치 항목을 미리 선택하는 것은 매우 일반적인 생각입니다. :)

내가 아는 모든 fdupe 도구에는이 방법이 있습니다 : 빠르고, 싸고 (선호하는 것은 filestat 정보를 기반으로합니다) 잠재적 인 일치가있는 경우에만 내용을 비교하십시오.

블록 비교를 수행하면 스트리밍이 가능하고 차이가 감지되는 즉시 일치를 무시할 수 있으므로 해시 비교보다 우선합니다. 전체 파일을 읽지 않아도됩니다.

  1. 당신이 변경되지 않는 많은 파일이있을 때 (당신이 사실을 균형을 데이터베이스에 미리 계산 된 해시를 저장할 수 있습니다 : 어떤 경우에 도움이 될 수 전체 콘텐츠 해시를 비교

    어떤 파일이 대규모로 복제 될 것으로 예상 할 때

  2. 때 해시를 계산하기 위해 전체 파일을 읽어야합니다.이 경우, 당신은 가 아닌에 대한 비교를 기대할 수 있습니다. d 비교의 한면을 읽지 않아도됩니다.

  3. 는 해싱은 매우 비싸다 읽고 전체 파일을 기본적으로 # 2

관련 문제