首页 > 解决方案 > 文件复制后比较两个文件 - 性能改进?

问题描述

我已经为我目前正在处理的各种不同(WinForms)应用程序构建了一个文件复制例程到一个公共库中。我所构建的实现了在显示进度的同时实际执行文件复制的常用CopyFileEx方法,这似乎工作得很好。

我遇到的唯一真正的问题是,因为我所做的大部分文件复制都是出于存档目的,一旦文件被复制,我想“验证”文件的新副本。我有以下方法来进行比较/验证。我相信你们中的许多人会很快看到“问题”在哪里:

Public Shared Function CompareFiles(ByVal File1 As IO.FileInfo, ByVal File2 As IO.FileInfo) As Boolean
    Dim Match As Boolean = False

    If File1.FullName = File2.FullName Then
        Match = True
    Else
        If File.Exists(File1.FullName) AndAlso File.Exists(File2.FullName) Then
            If File1.Length = File2.Length Then
                If File1.LastWriteTime = File2.LastWriteTime Then
                    Try
                        Dim File1Hash As String = HashFileForComparison(File1)
                        Dim File2Hash As String = HashFileForComparison(File2)

                        If File1Hash = File2Hash Then
                            Match = True
                        End If
                    Catch ex As Exception
                        Dim CompareError As New ErrorHandler(ex)

                        CompareError.LogException()
                    End Try
                End If
            End If
        End If
    End If

    Return Match
End Function

Private Shared Function HashFileForComparison(ByVal OriginalFile As IO.FileInfo) As String
    Using BufferedFileReader As New IO.BufferedStream(File.OpenRead(OriginalFile.FullName), 1200000)
        Using MD5 As New System.Security.Cryptography.MD5CryptoServiceProvider
            Dim FileHash As Byte() = MD5.ComputeHash(BufferedFileReader)

            Return System.Text.Encoding.Unicode.GetString(FileHash)
        End Using
    End Using
End Function

CompareFiles()方法首先检查一些“简单”元素:

但是,您猜对了,这就是性能受到打击的地方。特别是对于大文件,该MD5.ComputeHash方法的HashFileForComparison()方法可能需要一段时间——对于一个 500MB 的文件大约需要 1.25 分钟,总共需要大约 2.5 分钟来计算两个哈希值以进行比较。有没有人对如何更有效地验证文件的新副本有更好的建议?

标签: vb.netperformancemd5

解决方案


推荐阅读