【问题标题】:Move files only if they are image format仅当文件为图像格式时才移动文件
【发布时间】:2014-11-04 07:59:33
【问题描述】:

我只是想确定我是否遗漏了代码中的某些内容。我想在将文件从一个文件夹移动到另一个文件夹之前验证该文件是图像。我准备了这个函数并使用如下所示。你能告诉我好吗?我是否需要一些处置或其他任何东西,或者它只是退出足够。非常感谢,干杯。

Function IsValidImage(filename As String) As Boolean
    Try
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
        img.Dispose()
    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

【问题讨论】:

  • 使用异常来控制流是一种不好的做法。最好检查二进制文件,看看它是否与已知的图像格式匹配。
  • 查看answer 了解一些可能的方法。
  • 我会在您的try 末尾添加img.Dispose() 行,以确保在您不再需要资源时将其清除。
  • 我最后添加了 image.Dispose() 。现在应该可以了吧?
  • @Bob - 我仍然会说这不是好的代码,因为您使用异常来控制它。测试文件以查看它们是否是图像,不要依赖(昂贵的)异常抛出/引发。

标签: vb.net


【解决方案1】:

让文件路径为"D:\web\sample\Image\my.Image.png",则可以使用以下代码检查文件是否为图像文件:

    Dim filepath As String = "D:\web\sample\Image\my.Image.png"
    Dim imageExtensions() As String = {"bmp", "gif", "jpg", "png", "psd", "psp", "thm", "tif", "yuv"}
    Dim pat As String = "\\(?:.+)\\(.+)\.(.+)"
    Dim r As Regex = New Regex(pat)
    Dim m As Match = r.Match(filepath)
    If imageExtensions.Contains(m.Groups(2).Captures(0).ToString()) Then
        MsgBox("valid Image")
    End If

【讨论】:

  • 您可以创建一个文本文件并将其另存为pic.jpg,但这并不能使其成为图像文件。
  • @tim : 好问题,需要考虑更多
【解决方案2】:

你是在正确的道路上,但你应该下定决心要获得什么:

如果你想开发一种方法来告诉你文件的内容是否被认为是 .Net 识别的图片,你的方法完全没问题。

我从你的(稍微)过度工作的代码开始:

Function IsValidImage(filename As String) As Boolean
    Try
        Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)

            ' the file could be opened as image so it is valid
            Return True

        End Using
    Catch notValidException 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
    ' Every other Exception is considered not to be able too look whether the
    ' file is an Image or not, so it should be thrown to outside
End Function

不要将这种方法误判为使用Exception 进行控制流,如果文件的内容不可用于创建图像,您只会对抛出的方法做出反应。这让我们在框架上决定文件是否对Image有效。

让我们稍微改进一下你的方法,这样你就可以确定文件中的图像是否不超过给定的大小:

Function IsValidImage(filename As String, maxSize As Size) As Boolean
    Try
        Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)

            ' Returns True if the image is smaller or equal than maxSize
            Return img.Size.Width <= maxSize.Width AndAlso
                img.Size.Height <= maxSize.Height

        End Using
    Catch notValidException As OutOfMemoryException

        Return False

    End Try
End Function

这也不是滥用Exceptions。这是快速失败的一种做法:如果我无法获得Image,则该文件不是Image。否则,我会检查打开的 Image 上的尺寸,使我的结果取决于使用它完成的操作。

Exception 用于控制流可能,但不得如下:

Sub CheckImage(filename As String)
    Try
        Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)

        End Using
    Catch notValidException As OutOfMemoryException

        Throw New FileIsNoImageException()

    End Try
End Sub

Try
    CheckImage("c:\path\to\your\file.ext")
    'do something
    '
Catch invalid As FileIsNoImageException
    'do something else
    '
End Try

如果您认为文件不是Image 是错误的,那么即使这种方法也有效。 但通常你会在给你Image作为返回值的函数中这样做。

但这完全是不行

Sub CheckImage(filename As String)
    Try
        Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)

        Throw New FileIsImageException() ' DON'T DO SUCH A CRAP

        End Using
    Catch notValidException As OutOfMemoryException

        Throw New FileIsNoImageException()

    End Try
End Sub

Try
    CheckImage("c:\path\to\your\file.ext")
Catch valid As FileIsImageException
    'do something
    '
Catch invalid As FileIsNoImageException
    'do something else
    '
End Try

@Tim,对不起,但我再也听不到这个 Exception 使用是一个糟糕的实践故事了。

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 1970-01-01
    • 2014-05-12
    • 2014-09-05
    • 2016-09-05
    • 2021-02-12
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多