elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Codigo para eliminar archivos no existentes.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Codigo para eliminar archivos no existentes.  (Leído 2,433 veces)
xgorum

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Codigo para eliminar archivos no existentes.
« en: 9 Julio 2016, 00:37 am »

Bueno antes que nada pido mil perdones pues solo me registe para pedir ayuda y como usuario de foros se que no es de buen gusto pero busque y busque en google y no encontré nada. Mi nombre es Manuel y soy de Sevilla.

Tengo un problema. Estoy liado configurando Hyperspin. Los archivos que se usan en general para cada juego son las ROMs, las Wheel, los videos, las artes... todos van en carpetas distintas pero tienen el mismo nombre, por ejemplo para Game Boy el juego mario bros: la roms se llama Mario Bros.zip,  el vídeo se llama Mario Bros.mp4, el artwork Mario Bros.png, os podéis hacer una idea.

El caso es que tengo muchos más archivos media (vídeos, imágenes) que Roms. Por ejemplo para MAME tengo todos los media existentes pero no todas las Roms por lo que me gustaría eliminar todo los medias sobrante.
Parece una tontería pero cuando tienes que eliminar cerca 5000 archivos y para saber cuales tiene que compararlos con las roms te puede llevar años.

Entonces mi duda es si existe algún programa para tal hecho o si no como podría hacer un bat (por ejemplo) que me hiciese tal cosa, no se algo como:

- genero una txt con las roms [dir/b>"lista de archivos.txt"](Ese me lo se XD)
- comparo los archivos con los medias
- borro (o muevo de sitio) los media que no figuran en el txt.

Vuelvo a pedir disculpas por mi ignorancia pues mis estudios son de electrónica y lo mas que di fue ensamblador para programar microprocesadores.

Un Saludo a todos y si escribo aquí es por que sé que es de los mejores foros de programación en castellano que conozco


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Codigo para eliminar archivos no existentes.
« Respuesta #1 en: 11 Julio 2016, 06:50 am »

Hola

¿Loas archivos multimedia tienen el mismo nombre que las ROM?, por ejemplo: "juego.png" y "juego.zip". En ese caso puedo ayudarte, de lo contrario creo que no. Aclara ese punto por favor.

Saludos!


En línea

xgorum

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Codigo para eliminar archivos no existentes.
« Respuesta #2 en: 11 Julio 2016, 16:57 pm »

Si. Así es. Las Roms, y cada media van en carpetas distintas. Pero cada juego tiene el mismo nombre. Por ejemplo el juego Daytona USA: La rom se llama daytona.zip, el video se llama daytona.flv y su imagen se llama daytona.png.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Codigo para eliminar archivos no existentes.
« Respuesta #3 en: 11 Julio 2016, 18:20 pm »

En Batch no sería nada productivo, resultaría algo lento y produciría un código muy sucio.

Por ese motivo aquí abajo te muestro una solución basada en .NET (en dos lenguajes diferentes, VB.NET y C#, produciendo un código idéntico. elige el que prefieras), solo debes especificar las rutas correspondientes en la variable romsPath y el array miscPaths, y llamar al método RomUtil.CleanRoms().

Debo aclararte que para utilizar el siguiente código primero debes compilarlo (no lo puedes ejecutar directamente haciendo click en Windows...), y para ello lo puedes hacer con Visual Studio.

Este código es reproducible en otros lenguajes como Python, Ruby, etc, en los cuales así mismo necesitarás descargar el intérprete. En VBS también es reproducible, lo comento por que no necesitarías descargar "accesorios" adicionales (imagínatelo como hacer click en un archivo .bat), pero VBS también es un lenguaje limitado y habría que darle algunas vueltas con las funciones relacionadas del FileSystem, resultaría en un código algo feo y yo simplemente he preferido no ponerme a escribir instrucciones de más en un lenguaje que está de menos, pudiendo llevar a cabo lo mismo en otro lenguaje superior.



C#:
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using Vb = Microsoft.VisualBasic;
  6.  
  7. public sealed class RomUtil {
  8.  
  9.    public static readonly string romsPath = "C:\\...carpeta de las roms\\";
  10.    public static readonly string[] miscPaths = {
  11.    "C:\\...carpeta de las imágenes\\",
  12.    "C:\\...carpeta de los videos\\",
  13.    "etc..."
  14.    };
  15.  
  16.    private RomUtil() {}
  17.  
  18.    public static void CleanRoms() {
  19.  
  20.        Func<FileInfo, FileInfo, bool> comparisonPredicate =
  21.            (FileInfo a, FileInfo b) => {
  22.                return Path.GetFileNameWithoutExtension(a.Name).Equals(Path.GetFileNameWithoutExtension(b.Name), StringComparison.OrdinalIgnoreCase);
  23.            };
  24.  
  25.        IEnumerable<FileInfo> romFiles = new DirectoryInfo(romsPath).GetFiles(searchPattern: "*", searchOption: SearchOption.TopDirectoryOnly);
  26.  
  27.        List<FileInfo> miscFiles = new List<FileInfo>();
  28.        foreach (string dirpath in miscPaths) {
  29.            miscFiles.AddRange(new DirectoryInfo(dirpath).GetFiles(searchPattern: "*", searchOption: SearchOption.TopDirectoryOnly));
  30.        }
  31.  
  32.        foreach (FileInfo miscFile in miscFiles) {
  33.            bool isNotFound = (romFiles.FirstOrDefault((FileInfo f) => comparisonPredicate(f, miscFile)) == null);
  34.  
  35.            if ((isNotFound)) {
  36.                // Enviar el archivo a la papelera de reciclaje:
  37.                Vb.FileIO.FileSystem.DeleteFile(miscFile.FullName, Vb.FileIO.UIOption.OnlyErrorDialogs, Vb.FileIO.RecycleOption.SendToRecycleBin);
  38.  
  39.                // O eliminarlo permanentemente:
  40.                // miscFile.Delete();
  41.            }
  42.        }
  43.  
  44.    }
  45.  
  46. }


VisualBasic.NET:
Código
  1. Imports System;
  2. Imports System.Collections.Generic;
  3. Imports System.IO;
  4. Imports System.Linq;
  5. Imports Microsoft.VisualBasic
  6.  
  7. Public NotInheritable Class RomUtil
  8.  
  9.    Public Shared ReadOnly romsPath As String = "C:\...carpeta de las roms\"
  10.    Public Shared ReadOnly miscPaths As String() = {
  11.        "C:\...carpeta de las imágenes\",
  12.        "C:\...carpeta de los videos\",
  13.        "etc..."
  14.    }
  15.  
  16.    Private Sub New()
  17.    End Sub
  18.  
  19.    Public Shared Sub CleanRoms()
  20.  
  21.        Dim comparisonPredicate As Func(Of FileInfo, FileInfo, Boolean) =
  22.            Function(ByVal a As FileInfo, ByVal b As FileInfo)
  23.                Return Path.GetFileNameWithoutExtension(a.Name).Equals(Path.GetFileNameWithoutExtension(b.Name), StringComparison.OrdinalIgnoreCase)
  24.            End Function
  25.  
  26.        Dim romFiles As IEnumerable(Of FileInfo) =
  27.           New DirectoryInfo(romsPath).GetFiles("*", SearchOption.TopDirectoryOnly)
  28.  
  29.        Dim miscFiles As New List(Of FileInfo)
  30.        For Each dirpath As String In miscPaths
  31.            miscFiles.AddRange(New DirectoryInfo(dirpath).GetFiles("*", SearchOption.TopDirectoryOnly))
  32.        Next
  33.  
  34.        For Each miscFile As FileInfo In miscFiles
  35.            Dim isNotFound As Boolean =
  36.                (romFiles.FirstOrDefault(Function(f As FileInfo) comparisonPredicate(f, miscFile)) Is Nothing)
  37.  
  38.            If (isNotFound) Then
  39.                ' Enviar el archivo a la papelera de reciclaje:
  40.                FileIO.FileSystem.DeleteFile(miscFile.FullName, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
  41.  
  42.                ' O eliminarlo permanentemente:
  43.                ' miscFile.Delete()
  44.            End If
  45.        Next
  46.  
  47.    End Sub
  48.  
  49. End Class

Saludos!
« Última modificación: 11 Julio 2016, 18:49 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Codigo para eliminar archivos no existentes.
« Respuesta #4 en: 11 Julio 2016, 18:46 pm »

De todas formas te muestro un método de limpieza que escribí en Batch para las roms del MAME+ ...hace años ya, exactamente para el mismo propósito que comentas, yo me descargaba "packs" de carátulas y demás, y claro, me sobraban la mitad de archivos por que yo no tenía todas las roms que hacian referencia a esas carátulas, como te pasa a ti.

Código
  1. :Clean
  2. FOR /F "Tokens=*" %%a in ('Dir /B /A ".\%~1" ^| Find /V /I "Default.cfg" ^| Find /V /I "output.xml"') do (
  3. Set "Rom=%%a"
  4. IF NOT exist ".\Roms\!Rom:~0,-4!.zip" (
  5. IF NOT exist ".\Roms\!Rom:~0,-4!" (
  6. Echo: %%a
  7. MKDir ".\_Eliminados\%~1" 2>NUL
  8. Move /Y "%~1\%%a" ".\_Eliminados\%~1\" >NUL
  9. )
  10. )
  11. )
  12. Goto :EOF

Al código lo llamarías de la siguiente manera:

Código
  1. @Echo OFF & Setlocal EnableDelayedExpansion
  2. Call :Clean "C:\Carpeta de las imágenes"
  3. Call :Clean "C:\Carpeta de videos"
  4. ...

Ten en cuenta que ese código asume que existe una carpeta llamada "Roms" en el directorio de trabajo.
Úsalo bajo tu responsabilidad.

Aquí publiqué el código entero:

Citar
 

PD1: Las capturas las acabo de hacer, se ven con "malos" caracteres por la codificación actual que uso en la CMD en Windows 10.

PD2: Lo que puse de "Default.cfg" y "output.xml" en el código de arriba, si no recuerdo mal es por que son archivos que se deben ignorar, quiero decir, que no se deberían borrar en los directorios del MAME, pero hace mucho tiempo que no uso el MAME así que no te sabría confirmarlo ahora mismo. En el código de C# y VB.NET no se ignora ningún archivo, así que ten cuidado y haz una copia de seguridad antes de probar, si necesitas ignorar el "Default.cfg" y "output.xml" sería facil hacerlo.

Saludos
« Última modificación: 11 Julio 2016, 18:54 pm por Eleкtro » En línea

xgorum

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Codigo para eliminar archivos no existentes.
« Respuesta #5 en: 11 Julio 2016, 19:21 pm »

Muchas gracias Elektro.
Esta noche en el curro me pondré a compilar y mañana lo pruebo en mi PC. Os mantendré informado de como funciona. Gracias de veras me ahorras muchas horas de trabajo.
En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Codigo para eliminar archivos no existentes.
« Respuesta #6 en: 13 Julio 2016, 15:48 pm »

Ay sensei en serio quedo ANOnadado de ver con cuanta maestria y sabiduria haces estas cosas...pero eliminar archivos???

naaa esos archivos del mame ni que llenaran el disco, y no tomaria años, ni siquiera días, solo una o dos horas máximo.

jajaj igual quede descrestado al ver ese programa, y con interfaz bonita y todo, y yo que todavia sigo tratando de entender Razor y MVC en Visual Studio, me hace sentir pequeño, pero motivado  :laugh: :laugh:
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines