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:
de donde sale pathdup
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.
Publicar un comentario