Я встроил процедуру копирования файлов в общую библиотеку для различных приложений (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 минут для вычисления обоих хэшей для сравнения.У кого-нибудь есть лучшее предложение о том, как более эффективно проверить новую копию файла?