2012-10-11 16 views
5

Voglio convalidare se tutti i file in una directory sono di un certo tipo. Quello che ho fatto finora è.controlla se il file è di un certo tipo

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; 
     } 

    } 

Questo funziona bene se il nome del file ha estensione come {file.jpeg, File.jpg} questo non riesce se i file hanno estensioni {file1 file2}. Quando faccio la seguente nel mio terminale ottengo:

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

Update 1:

Ho cercato di ottenere i numeri magici del file per verificare se è 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); 
      } 
     } 

Mi sono imbattuto in un altro problema. Ci sono alcuni file .DS_Store nella mia cartella. Qualche idea su come ignorarli?

+3

Vuoi dire come verificare se il file che non ha estensione è un file JPEG o no? –

+0

Sì hai ragione !! –

+0

Solo perché un nome file termina con una particolare estensione non significa che il contenuto di quel file corrisponda al suo nome. È necessario leggere il contenuto del file (almeno i primi N byte) - questo è ciò che il comando "file" fa ... –

risposta

3

In primo luogo, le estensioni dei file non sono obbligatorie, un file senza estensione potrebbe benissimo essere un file JPEG valido.

Controllare il formato RFC per JPEG, i formati di file in genere iniziano con una sequenza fissa di byte per identificare il formato del file. Questo non è decisamente semplice, ma non sono sicuro che ci sia un modo migliore.

In breve, è necessario aprire ogni file, leggere i primi n byte in base al formato del file, verificare se corrispondono al formato di file previsto. Se lo fanno, è un file JPEG valido anche se ha un'estensione exe o anche se non ha alcuna estensione.

+0

Ho fatto qualche aggiornamento. Puoi dirmi se sto andando nel modo giusto? –

2

Per i file JPEG è possibile fare il check numero magico nell'intestazione del file:

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; 
    } 
} 

metodo più completo qui che EXIFF copre così: C# How can I test a file is a jpeg?

+0

I JPEG hanno un'intestazione formale? il tuo approccio è interessante ma non è sicuro se funzionerà con JPEGS. –

+0

Per essere un JPEG valido avranno questi nel loro header ... – emalamisura

+0

Ho fatto qualche aggiornamento. Puoi dirmi se sto andando nel modo giusto? –

2

Una buona (anche se costoso) verificare la presenza di validità come immagine intesa da J2SE è provare a ImageIO.read(File) it. Questo metodo genera alcune eccezioni molto utili se non trova un'immagine nel file fornito.

+0

Ho fatto qualche aggiornamento. Puoi dirmi se sto andando nel modo giusto? –

Problemi correlati