2012-10-11 38 views
5

Quiero validar si todos los archivos en un directorio son de un cierto tipo. Lo que hice hasta ahora escompruebe si el archivo es de un tipo determinado

private static final String[] IMAGE_EXTS = { "jpg", "jpeg" }; 

private void validateFolderPath(String folderPath, final String[] ext) { 

     File dir = new File(folderPath); 

     int totalFiles = dir.listFiles().length; 

     // Filter the files with JPEG or JPG extensions. 
     File[] matchingFiles = dir.listFiles(new FileFilter() { 
      public boolean accept(File pathname) { 
       return pathname.getName().endsWith(ext[0]) 
         || pathname.getName().endsWith(ext[1]); 
      } 
     }); 

     // Check if all the files have JPEG or JPG extensions 
     // Terminate if validation fails. 
     if (matchingFiles.length != totalFiles) { 
      System.out.println("All the tiles should be of type " + ext[0] 
        + " or " + ext[1]); 
      System.exit(0); 
     } else { 
      return; 
     } 

    } 

Esto funciona bien si el nombre del archivo tiene una extensión como {file.jpeg, archivo.jpg} Esta falla si los archivos no tienen extensiones {} archivo1 archivo2. Cuando hago lo siguiente en mi terminal me sale:

$ file folder/file1 
folder/file1: JPEG image data, JFIF standard 1.01 

Actualización 1:

He intentado conseguir los números mágicos del archivo para comprobar si es JPEG:

for (int i = 0; i < totalFiles; i++) { 
      DataInputStream input = new DataInputStream(
        new BufferedInputStream(new FileInputStream(
          dir.listFiles()[i]))); 

      if (input.readInt() == 0xffd8ffe0) { 
       isJPEGFlag = true; 
      } else { 
       isJPEGFlag = false; 
       try { 
        input.close(); 
       } catch (IOException ignore) { 
       } 
       System.out.println("File not JPEG"); 
       System.exit(0); 
      } 
     } 

Me encontré con otro problema. Hay algunos archivos .DS_Store en mi carpeta. ¿Alguna idea de cómo ignorarlos?

+3

¿Quiere decir cómo verifica si el archivo que no tiene extensión es un archivo JPEG o no? –

+0

¡Sí, tienes razón! –

+0

El hecho de que un nombre de archivo termine con una extensión particular no significa que el _content_ de ese archivo corresponda a su nombre. Necesita leer el contenido del archivo (al menos los primeros N bytes) - eso es lo que hace el comando 'file' ... –

Respuesta

3

En primer lugar, las extensiones de archivo no son obligatorias, un archivo sin extensión podría ser un archivo JPEG válido.

Compruebe el formato RFC para JPEG, los formatos de archivo generalmente comienzan con una secuencia fija de bytes para identificar el formato del archivo. Esto definitivamente no es sencillo, pero no estoy seguro si hay una mejor manera.

En resumen, debe abrir cada archivo, leer primero n bytes según el formato de archivo, verificar si coinciden con el formato de archivo que espera. Si lo hacen, es un archivo JPEG válido incluso si tiene una extensión exe o incluso si no tiene ninguna extensión.

+0

Hice algunas actualizaciones. ¿Me puede decir si voy por el camino correcto? –

2

Para archivos JPEG que ha de hacer el registro de entrada número mágico en la cabecera del archivo:

static bool HasJpegHeader(string filename) 
{ 
    using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open))) 
    { 
     UInt16 soi = br.ReadUInt16(); 
     UInt16 jfif = br.ReadUInt16();  
     return soi == 0xd8ff && jfif == 0xe0ff; 
    } 
} 

método más completa aquí, que cubre EXIFF así: C# How can I test a file is a jpeg?

+0

¿Los JPEG tienen un encabezado formal? su enfoque es interesante pero no está seguro si funcionará para JPEGS. –

+0

Para ser un JPEG válido, tendrán estos en su encabezado ... – emalamisura

+0

Hice algunas actualizaciones. ¿Me puede decir si voy por el camino correcto? –

2

Una buena (aunque caro) comprobar la validez como una imagen entendida por J2SE es intentar ImageIO.read(File). Ese método arroja algunas excepciones bastante útiles si no encuentra una imagen en el archivo proporcionado.

+0

Hice algunas actualizaciones. ¿Me puede decir si voy por el camino correcto? –

Cuestiones relacionadas