vb.net - 文件复制后比较两个文件 - 性能改进?
问题描述
我已经为我目前正在处理的各种不同(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()
方法可能需要一段时间——对于一个 500MB 的文件大约需要 1.25 分钟,总共需要大约 2.5 分钟来计算两个哈希值以进行比较。有没有人对如何更有效地验证文件的新副本有更好的建议?
解决方案
推荐阅读
- python - 如何更改 Databricks“运行”选项卡跟踪的实验?
- arrays - 如何将对象数组转换为 MongoDB 中父对象中的字段?
- google-docs - Google Docs:在查找和替换结果中插入换行符
- ios - 在 iOS 上的点击行为与 disableSynchroniztion 不一致
- bluetooth - 在哪里可以找到核心蓝牙规范?
- php - Summernote 代码已将内联 CSS 样式标签写入 [已删除]
- ansible - 使用 parted 输出中的属性
- react-native - 我在渲染元素内使用带有 onPress 功能的地图功能时遇到了一些问题
- node.js - req.body.param 不断获得 undefined 的值
- python - 我想使用 python 列表理解来实现冒泡排序,但它显示为空白