我不想依赖于文件扩展名,也不关心图片的类型(如.jpg、.png等),我只想知道文件是不是图片。如果可能的话,我不想使用任何非.NET dll。
我目前所知的最佳方式如下:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
如此指出:http://msdn.microsoft.com/en-us/library/stf701f5.aspx,如果文件不是有效的图像格式,则Image.FromFile()
会抛出OutOfMemoryException
。使用上述方法可以得到恰好我想要的结果,但是出于以下原因,我宁愿不使用它:
- 我认为在正常程序执行中使用try-catch是一种性能不佳的坏习惯。
Image.FromFile()
将整个图像文件(如果是图像文件)加载到内存中。这是浪费的,因为我只需要文件类型,并且在代码的这个点上不需要进行任何进一步的图像操作。- 我不喜欢捕获
OutOfMemoryException
,因为如果有真正的内存不足问题,我的程序会吞噬它并继续运行,那该怎么办?
是否有更好的方法来解决这个问题? 或者,上述所有/部分问题是否无关紧要?
编辑:自从在这里接收到答案以来,这些是我现在了解到的三种解决方案:
- 通过
Image.FromFile()
和try-catch将整个图像加载到内存中。- 优点:对图像文件内容进行深入检查;涵盖许多图像类型。
- 缺点:最慢;来自try-catch和完整图像文件加载的开销;由于捕获了“真正的”OutOfMemoryException而可能存在的潜在危险。
- 检查图像文件的标头字节。
- 优点:快速,内存使用率低。
- 缺点:潜在的脆弱性;需要为每种文件类型编程。
- 检查文件扩展名。
- 优点:最快,最简单。
- 缺点:不能在所有情况下工作;最容易出错。
(我没有看到明显的“赢家”,因为我可以想象出每种方法都适用的情况。对于我的应用程序目的,文件类型检查不太频繁,因此方法1的性能问题不是问题。)