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