2012-10-11 17 views
5

Chcę sprawdzić, czy wszystkie pliki w katalogu są określonego typu. To, co zrobiłem do tej pory, to.Sprawdź, czy plik jest określonego typu.

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

    } 

Działa to dobrze, jeśli nazwa pliku ma rozszerzenie jak {file.jpeg, file.jpg} ta zawodzi, jeśli pliki nie mają rozszerzenia {plik1 plik2}. Kiedy należy wykonać następujące czynności w moim terminalu uzyskać:

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

Aktualizacja 1:

Próbowałem dostać magiczne numery pliku, aby sprawdzić, czy jest 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); 
      } 
     } 

Wpadłem na inny problem. W moim folderze znajduje się kilka plików: .DS_Store. Każdy pomysł, jak je zignorować?

+3

Masz na myśli, w jaki sposób możesz sprawdzić, czy plik bez rozszerzenia jest plikiem JPEG, czy nie? –

+0

Tak, masz rację !! –

+0

To, że nazwa pliku kończy się określonym rozszerzeniem, nie oznacza, że ​​_content_ tego pliku odpowiada jego nazwie. Musisz przeczytać zawartość pliku (przynajmniej pierwsze N ​​bajtów) - to właśnie robi polecenie "file" ... –

Odpowiedz

3

Po pierwsze, rozszerzenia plików nie są obowiązkowe, plik bez rozszerzenia może równie dobrze być prawidłowym plikiem JPEG.

Sprawdź RFC dla formatu JPEG, formaty plików na ogół zaczynają się od ustalonej sekwencji bajtów, aby zidentyfikować format pliku. To zdecydowanie nie jest proste, ale nie jestem pewien, czy istnieje lepszy sposób.

W skrócie należy otworzyć każdy plik, przeczytać pierwsze n bajtów w zależności od formatu pliku, sprawdzić, czy pasują do oczekiwanego formatu pliku. Jeśli tak, to jest to prawidłowy plik JPEG, nawet jeśli ma rozszerzenie exe lub nawet jeśli nie ma żadnego rozszerzenia.

+0

Zrobiłem aktualizację. Czy możesz mi powiedzieć, czy idę we właściwy sposób? –

2

Dla plików JPEG można zrobić magiczny numer czeku w nagłówku pliku:

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

Więcej kompletna metoda tutaj który obejmuje EXIFF także: C# How can I test a file is a jpeg?

+0

Czy JPEG mają formalny nagłówek? Twoje podejście jest interesujące, ale nie masz pewności, czy zadziała w przypadku plików JPEG. –

+0

Aby być ważnym plikiem JPEG, będą one miały nagłówek ... – emalamisura

+0

Wprowadziłem trochę aktualizacji. Czy możesz mi powiedzieć, czy idę we właściwy sposób? –

2

jeden dobry (choć drogie) sprawdzenia ważności jak obraz zrozumiany przez J2SE jest próba ImageIO.read(File) go. Metody te rzucają dość pomocne wyjątki, jeśli nie znajdują obrazu w dostarczonym pliku.

+0

Wprowadziłem trochę aktualizacji. Czy możesz mi powiedzieć, czy idę we właściwy sposób? –