2010-04-01 2 views
2

아직 VB.Net (2008, Express Edition)에 대해 충분히 알지 못하기 때문에 이름이 같지 만 동일한 내용의 파일을 찾는 더 좋은 방법이 있는지 묻고 싶습니다. 중복.중복 된 파일을 찾는 좋은 방법은 무엇입니까?

다음 코드에서 GetFiles()를 사용하여 주어진 디렉토리의 모든 파일을 검색하고 각 파일에 대해 MD5를 사용하여 내용을 해시하고이 값이 사전에 존재하는지 확인합니다. 중복 및 나는 그것을 삭제합니다; 그렇지 않으면, 나는 나중에 사전에이 파일 이름/hashvalue을 추가

'Get all files from directory 
Dim currfile As String 
For Each currfile In Directory.GetFiles("C:\MyFiles\", "File.*") 
    'Check if hashing already found as value, ie. duplicate 
    If StoreItem.ContainsValue(ReadFileMD5(currfile)) Then 
     'Delete duplicate 
    'This hashing not yet found in dictionary -> add it 
    Else 
     StoreItem.Add(currfile, ReadFileMD5(currfile)) 
    End If 
Next 

이 중복을 찾는 문제를 해결하는 좋은 방법, 아니면 내가 알아야 할 더 좋은 방법이 있나요?

감사합니다.

+0

작은 nitpick : 루프 앞에 루프 변수를 선언하지 마십시오. 불필요하고 오류가 발생하기 쉽습니다. 루프에서 선언되지 않은 변수를 사용하고 있으면 선언 된 변수가 자동으로 선언되고 범위가 루프로 제한됩니다. 'Option Infer On'을 사용하거나'As XYZ'를 사용하여 명시 적으로 타입을 선언 할 경우 자동으로 올바른 타입을 갖습니다. –

답변

3

만이이

  • 같은 길이에게 있습니다 그들과 함께 각 파일을 다음

    • 으로 반복 모든 파일에 의해이 문제를 최적화하고 파일 이름과 길이
    • 그런 비교 (MD5)를 기록 할 수 있습니다 이러한 작업 중 하나 인 embarrassingly parallel이라면 다중 스레드를 사용하여보다 효율적으로 수행 할 수 있어야하며 각 비교가 독립적이기 때문에 각 비교는 독립적입니다.
    • 두 파일을 한 번에 비교하면됩니다. . 비교 (f1, f2)하면 비교 (f2, f1) 할 필요가 없습니다.

    나는 다른 많은 것들이있을 것이라고 확신합니다.

  • +0

    도움말을 주셔서 감사합니다. – Gulbahar

    0

    MD5 해시를 한 번만 계산하면이 루틴을 약간 최적화 할 수 있습니다 (질문에 오타가 있거나 실제로 두 번하고있는 경우).

    또한 해시를 계산하기 전에 파일 길이를 비교할 수 있습니다. 길이가 다른 경우 해시 값도 다를 수 있습니다 (이론적으로는 동일하지만 예상보다 적음).

    관련 문제