Хороший способ найти дубликаты файлов? - PullRequest
2 голосов
/ 01 апреля 2010

Я пока недостаточно знаю о 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

Это хороший способ решить проблему поиска дубликатов, или есть лучший способ, о котором я должен знать?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2010

Вы можете оптимизировать это следующим

  • Переберите все файлы и запишите имя файла и длину
  • Затем сравните (MD5) каждый файл только с теми, которые имеют одинаковую длину
  • Это одна из тех задач, которая называется смущающе параллельной , поэтому вы должны иметь возможность использовать несколько потоков, чтобы сделать это и более эффективно, и так как каждое сравнение является независимым
  • Вам нужно сравнивать один файл с другим только один раз, а не наоборот, т.е. если вы сравниваете (f1, f2), вам не нужно сравнивать (f2, f1)

Я уверен, что есть много других.

0 голосов
/ 01 апреля 2010

Вы можете немного оптимизировать эту процедуру, вычисляя хеш MD5 только один раз (это либо опечатка в вопросе, либо вы действительно делаете это дважды).

Кроме того, вы можете сравнить длины файлов перед вычислением хэша: если длины разные, значения хеш-функции также будут разными (теоретически они могут быть идентичными, но это менее чем вероятно).

...