检查文件是不是属于某种类型
Posted
技术标签:
【中文标题】检查文件是不是属于某种类型【英文标题】:check if the file is of a certain type检查文件是否属于某种类型 【发布时间】:2012-10-02 11:29:10 【问题描述】:我想验证一个目录中的所有文件是否都属于某种类型。到目前为止我所做的是。
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 文件。 知道如何忽略它们吗?
【问题讨论】:
你的意思是如何验证没有扩展名的文件是否是JPEG文件? 文件名以特定扩展名结尾并不意味着该文件的内容与其名称相对应。您需要读取文件的内容(至少前 N 个字节)——这就是“文件”命令的作用...... 有没有人注意到Windows 喜欢创建带有.jpe
扩展名的JPEG 图像? AFAIR 是直接从 IE 中保存图像,但我的记忆有点模糊。
变化看起来没问题,除了我会将你的流包装在 using 块中,以便在读取每个文件后关闭连接。
【参考方案1】:
首先,文件扩展名不是强制性的,没有扩展名的文件很可能是有效的 JPEG 文件。
查看 RFC for JPEG 格式,文件格式通常以一些固定的字节序列开头,以识别文件的格式。这绝对不是直截了当的,但我不确定是否有更好的方法。
简而言之,您必须打开每个文件,根据文件格式读取前 n 个字节,检查它们是否与您期望的文件格式匹配。如果他们这样做,即使它具有 exe 扩展名或即使它没有任何扩展名,它也是一个有效的 JPEG 文件。
【讨论】:
我做了一些更新。你能告诉我我走的路是否正确吗?【参考方案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# How can I test a file is a jpeg?
【讨论】:
JPEG 有正式的标题吗?您的方法很有趣,但不确定它是否适用于 JPEGS。 我做了一些更新。你能告诉我我走的路是否正确吗?【参考方案3】:对 J2SE 理解的图像的有效性进行一个很好的(虽然昂贵)检查是尝试ImageIO.read(File)
它。如果在提供的文件中找不到图像,该方法会抛出一些非常有用的异常。
【讨论】:
我做了一些更新。你能告诉我我走的路是否正确吗?以上是关于检查文件是不是属于某种类型的主要内容,如果未能解决你的问题,请参考以下文章