在VB.NET中检查文件类型?

时间:2010-08-24 15:04:33

标签: vb.net image validation file-type

我有一个图像大小调整的程序,它的工作原理。问题是当用户在文件选择对话框中选择非图像文件时,它会崩溃。如何查看图像文件?

5 个答案:

答案 0 :(得分:7)

由于OP坚持使用VB版本,因此VB.NET等效于0xA3's answer

Function IsValidImage(filename As String) As Boolean
    Try
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
    Catch generatedExceptionName As OutOfMemoryException
        ' Image.FromFile throws an OutOfMemoryException  
        ' if the file does not have a valid image format or 
        ' GDI+ does not support the pixel format of the file. 
        ' 
        Return False
    End Try
    Return True
End Function

您可以按如下方式使用它:

If IsValidImage("c:\path\to\your\file.ext") Then
    'do something
    '
Else
    'do something else
    '
End If

修改
我不建议您检查文件扩展名。任何人都可以使用.jpg扩展名保存不同的文件(例如文本文档)并诱骗您使用该应用程序以获取它是一张图片。

最好的方法是使用上面的函数加载图像或打开前几个字节并检查JPEG签名。



您可以在此处找到有关JPEG文件及其标题的更多信息:

答案 1 :(得分:5)

非常原始的检查是简单地尝试加载图像。如果它无效,则会抛出OutOfMemoryException

static bool IsImageValid(string filename)
{
    try
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(filename);
    }
    catch (OutOfMemoryException)
    {
        // Image.FromFile throws an OutOfMemoryException 
        // if the file does not have a valid image format or
        // GDI+ does not support the pixel format of the file.
        //
        return false;
    }
    return true;
}

如果我正确地理解了您的问题,那么无论如何它都会加载图像。因此,简单地将加载操作包装在try / catch块中并不意味着任何额外的开销。对于这种方法的VB.NET解决方案,请查看@Alex Essilfie的答案。

有些人想知道为什么Image.FromFile在无效文件上投放OOM应该在Hans Passant的答案中读到以下问题:

  

<强> Is there a reason Image.FromFile throws an OutOfMemoryException for an invalid image format?

答案 2 :(得分:3)

当然,你的第一道防线只是检查文件的扩展名:

Function IsImageFile(ByVal filename As String) As Boolean
    Dim ext As String = Path.GetExtension(filename).ToLowerInvariant()

    ' This supposes your program can deal only with JPG files; '
    ' you could add other extensions here as necessary. '
    Return ext = ".jpg" OrElse ext = ".jpeg"
End Function

更好的是,正如SLC在评论中建议的那样,设置对话框的Filter属性:

dialog.Filter = "Image files|*.jpg;*.jpeg"

这不是一个保证 - 理想情况下你想检查文件本身以验证它是一个图像,理论上你也应该能够加载具有异常扩展的文件,如果它们实际上是图像文件(也许只是首先要求用户确认) - 但这是一个简单的开始。

答案 3 :(得分:2)

如果您计划更改或移动文件,VB和C#答案很棒,但也包含“陷阱”:创建的'img'对象将锁定图像文件,除非调用dispose()方法释放它。见下文:

VB
    Function IsValidImage(filename As String) As Boolean
    Try
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
        img.dispose()  ' Removes file-lock of IIS
    Catch generatedExceptionName As OutOfMemoryException
        ' Image.FromFile throws an OutOfMemoryException  
        ' if the file does not have a valid image format or 
        ' GDI+ does not support the pixel format of the file. 
        ' 
        Return False
    End Try
    Return True
End Function

C#
static bool IsImageValid(string filename)
{
    try
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(filename);
        img.dispose();   // Removes file-lock of IIS
    }
    catch (OutOfMemoryException)
    {
        // Image.FromFile throws an OutOfMemoryException 
        // if the file does not have a valid image format or
        // GDI+ does not support the pixel format of the file.
        //
        return false;
    }
    return true;
}

答案 4 :(得分:0)

最强大的方法是了解您需要加载的文件的签名。

JPEG具有特定的标题格式,例如。

这样,只要查看扩展名,您的代码就不会那么容易被愚弄。

163的回答应该可以帮助你完成这些工作。