2012-10-11 17 views
5

Ich möchte überprüfen, ob alle Dateien in einem Verzeichnis einen bestimmten Typ haben. Was ich bisher gemacht habe ist.Überprüfen Sie, ob die Datei einen bestimmten Typ hat

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

    } 

Dies funktioniert gut, wenn der Dateiname eine Erweiterung wie {file.jpeg, file.jpg} haben Dies schlägt fehl, wenn die Dateien keine Erweiterungen {Datei1 Datei2}. Wenn ich die folgenden in meinem Terminal erhalte ich:

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

Update 1:

ich die magischen Zahlen der Datei zu erhalten versucht, zu überprüfen, ob es JPEG ist:

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

Ich stieß auf ein anderes Problem. Es gibt einige .DS_Store Dateien in meinem Ordner. Irgendeine Idee, wie man sie ignoriert?

+3

Sie meinen, wie überprüfen Sie, ob die Datei ohne Erweiterung eine JPEG-Datei ist oder nicht? –

+0

Ja, Sie haben Recht !! –

+0

Nur weil ein Dateiname mit einer bestimmten Erweiterung endet, bedeutet dies nicht, dass der _content_ dieser Datei seinem Namen entspricht. Sie müssen den Inhalt der Datei lesen (mindestens die ersten N Bytes) - das ist der Befehl 'datei' ... –

Antwort

3

Erstens, Dateierweiterungen sind nicht obligatorisch, eine Datei ohne Erweiterung könnte sehr wohl eine gültige JPEG-Datei sein.

Überprüfen Sie das RFC für JPEG-Format, beginnen die Dateiformate in der Regel mit einigen festen Sequenz von Bytes, um das Format der Datei zu identifizieren. Das ist definitiv nicht einfach, aber ich bin mir nicht sicher, ob es einen besseren Weg gibt.

Kurz gesagt, müssen Sie jede Datei öffnen, lesen Sie zuerst n Bytes je nach Dateiformat, überprüfen Sie, ob sie mit Dateiformat übereinstimmen, das Sie erwarten. Ist dies der Fall, ist es eine gültige JPEG-Datei, auch wenn es eine Exe-Erweiterung hat oder wenn es keine Erweiterung hat.

+0

Ich habe ein Update gemacht. Kannst du mir sagen, ob ich in die richtige Richtung gehe? –

2

Für JPEGs können Sie die magische Zahl Check-in-Header der Datei tun:

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

Ausführlichere Verfahren hier die EXIFF und umfasst: C# How can I test a file is a jpeg?

+0

Haben JPEGs einen formalen Header? Ihr Ansatz ist interessant, aber nicht sicher, ob es für JPEGs funktioniert. –

+0

Um ein gültiges JPEG zu sein, werden sie diese in ihrer Kopfzeile haben ... – emalamisura

+0

Ich habe ein Update gemacht. Kannst du mir sagen, ob ich in die richtige Richtung gehe? –

2

Eine gute (wenn auch teuer) eine Überprüfung auf Gültigkeit wie ein Bild von J2SE verstanden wird, versuchen Sie ImageIO.read(File) es. Diese Methode löst einige recht hilfreiche Ausnahmen aus, wenn sie in der Datei kein Bild findet.

+0

Ich habe ein Update gemacht. Kannst du mir sagen, ob ich in die richtige Richtung gehe? –

Verwandte Themen