martes, 18 de septiembre de 2012

Archivos duplicados y hash MD5

Enunciado

Quieres detectar y mover a una carpeta todos los archivos duplicados en una carpeta y subcarpetas. 
Cuando hay duplicidados mueves el archivo con nombre mas largo o que está en una subcarpeta.
En la nueva carpeta creas las subcarpetas originales.

Solución:

Para detectar los archivos duplicados usamos el hash MD5 calculado con la clase correspondiente en el framework .NET, recorremos recursivamente las carpetas, comparando archivos  y moviendo el que tiene path completo mas largo.
Const pathdup="c:\duplicados" 'carpeta donde se moveran los duplicados
Sub procesaCarpeta(carpeta As String)
'carpeta: carpeta a recorrer
   Dim existencias As Dictionary(Of String, String)
    Dim Md5 As New MD5CryptoServiceProvider()
        Try
            Dim archivos = My.Computer.FileSystem.GetFiles(carpeta)

            For Each archivo In archivos
                Dim acont = My.Computer.FileSystem.ReadAllBytes(archivo)
                Dim clave = Convert.ToBase64String(Md5.ComputeHash(acont))
                If existencias.ContainsKey(clave) Then
                    If existencias(clave).Length <= archivo.Length Then
                        'mover nuevo
                        My.Computer.FileSystem.MoveFile(archivo, archivo.Replace("C:\", pathdup))
                    Else
                        My.Computer.FileSystem.MoveFile(existencias(clave), existencias(clave).Replace("C:\", pathdup))
                        existencias(clave) = archivo
                    End If
                Else
                    existencias.Add(clave, archivo)
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, carpeta)
        End Try

        For Each hija In My.Computer.FileSystem.GetDirectories(carpeta)
            procesaCarpeta(hija)
        Next
    End Sub

Comentario

Puede parecer tonto pero limpié 7 Gb del disco duro de mi casa. La explicación es simple, mi hija antes de editar copiaba todas las imágenes de una carpeta y las pegaba en la misma carpeta o en una  subcarpeta (a veces ambas cosas).

2 comentarios:

Anónimo dijo...

de donde sale pathdup

Arturo Soler dijo...

Tienes razón, supongo que pathdup vendría de una constante o variable global. Hace ya tiempo y no sé en que maquina lo programé.
He modificado el código y lo he puesto como constante.