Сравнение двух файлов после копирования файлов - улучшения производительности? - PullRequest
0 голосов
/ 13 ноября 2018

Я встроил процедуру копирования файлов в общую библиотеку для различных приложений (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() сначала проверяет несколько «простых» элементов:

  • Он пытается сравнить файл с самим собой?(если так, всегда возвращайте True)
  • Существуют ли оба файла на самом деле?
  • Являются ли два файла одинакового размера?
  • У них обоих одинаковая дата изменения?

Но, как вы уже догадались, вот где производительность берет удар.Особенно для больших файлов метод MD5.ComputeHash метода HashFileForComparison() может занять некоторое время - около 1,25 минуты для файла размером 500 МБ и в общей сложности около 2,5 минут для вычисления обоих хэшей для сравнения.У кого-нибудь есть лучшее предложение о том, как более эффективно проверить новую копию файла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...