5

ディレクトリ内のすべてのファイルが特定のタイプであるかどうかを検証したい。私がこれまでに行ったことはです。

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

    }

ファイル名に {file.jpeg, file.jpg} のような拡張子がある場合、これは正常に機能します。ファイルに拡張子がない場合、これは失敗します {file1 file2}。端末で次のことを行うと、次のようになります。

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

更新 1:

ファイルのマジック ナンバーを取得して、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);
            }
        }

私は別の問題に遭遇しました。フォルダに.DS_Storeファイルがいくつかあります。それらを無視する方法はありますか?

4

3 に答える 3

3

まず、ファイル拡張子は必須ではありません。拡張子のないファイルは、有効な JPEG ファイルである可能性が非常に高くなります。

RFC で JPEG 形式を確認してください。ファイル形式は、通常、ファイルの形式を識別するために固定された一連のバイトで始まります。これは間違いなく簡単ではありませんが、より良い方法があるかどうかはわかりません。

簡単に言えば、各ファイルを開き、ファイル形式に応じて最初の n バイトを読み取り、期待するファイル形式と一致するかどうかを確認する必要があります。その場合、拡張子が exe であっても、拡張子がなくても、有効な JPEG ファイルです。

于 2012-10-11T18:05:34.900 に答える
2

J2SE が理解するイメージとしての有効性を (費用はかかりますが) 適切にチェックする方法の 1 つは、試してみるImageIO.read(File)ことです。そのメソッドは、提供されたファイルに画像が見つからない場合、非常に役立つ例外をいくつかスローします。

于 2012-10-11T18:39:32.143 に答える
2

JPEG の場合、ファイルのヘッダーでマジック ナンバー チェックを実行できます。

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

ここでは、EXIFF もカバーするより完全な方法: C# ファイルが jpeg であることをテストするにはどうすればよいですか?

于 2012-10-11T18:08:18.280 に答える