用VB怎么进行文件比对?

kmzs 2004-11-14 06:59:28
用VB怎么进行任意两个文件比对?

谢谢!!!
...全文
444 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiqi5521 2004-11-19
  • 打赏
  • 举报
回复
奇怪,昨天的测试和今天测试结果大不一样,今天再测的时候发现40KB缓存的性能是最好的。十多次测试全部是40KB胜出,并非偶然。
仔细想想有什么不同,昨天做测试的时候,已经开机几个小时了,今天的测试是一大早刚开机的时候做的,就这点不同吧!!还是有别的原因?想不通。其实也不必深究,每个人的电脑都不同,有个大致的结果就可以了,不必太精确。
Abyss-Xu 2004-11-18
  • 打赏
  • 举报
回复
学习
lang_csdn 2004-11-18
  • 打赏
  • 举报
回复
mark
terence4444 2004-11-18
  • 打赏
  • 举报
回复
个人觉得还是用MD5比对,既高效又准确
wumylove1234 2004-11-18
  • 打赏
  • 举报
回复
今天太忙了.中午看看学习一下啊!!!!
小吉挺强啊!

你那些时间数据,什么24M,7M之类的,是如何算出来的.
wumylove1234 2004-11-18
  • 打赏
  • 举报
回复
强!学习中.....
guoxu_009 2004-11-18
  • 打赏
  • 举报
回复
支持楼上的,学习中.........
qiqi5521 2004-11-18
  • 打赏
  • 举报
回复
由于电脑软硬件系统千变万化,小吉的结论在我的机器上发生了一些变化,愿共同探讨。
具体的情况:
1。经试验,缓存大小为 1MB 时性能达到峰值,再大了性能反而下降。与小吉的 40KB 达到峰值不太一致。
2。实验缓存大小为1024整数倍时对性能的影响,经实验,有性能差异,但不显著。当然由于电脑软硬件系统千变万化,不能说小吉结论是错的,只是在不同的机器上会不一样,我还是赞同小吉的方法,毕竟
凑个1024整数倍不是什么难事。

愿我的结果能给大家提供一些参考。我机器(C2 766MHz,128M SDR,20G 7200;Win2000+SP1,VB6+SP4 调试)(老爷机,现眼了~~)
homezj 2004-11-18
  • 打赏
  • 举报
回复
呵呵!闲来无事,写了段文件比对代码,在我机器上(C4 2.4GHz,256M DDR,80G 7200;WinXP+SP2,VB6+SP6 调试) ,实测异盘比对速度为11-12MB/S(Long型比对)与6-7MB/S(Byte型比对)。同盘之间比对,速度约提高10%,而且NTFS分区比FAT32分区快3%,C盘(磁道外侧)比H盘(磁道内侧)快一点。
估计这速度够用了吧,10M以内的文件,都能瞬间完成。
我的两个样本文件为同一个Mpg文件的复本,大小为184M,我在110M处改写了一个字节,用Long型找出,用时9.2秒,用Byte型为16.4秒。
样本文件,最好选用50M以上的文件,否则缓存影响太大,用两个14M的RAR文件比对,第一次用时近2秒,第二次只用0.6秒


Option Explicit
Private CencelCopy As Boolean
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)

Private Sub Command1_Click()
Dim Pos As Long
Command1.Enabled = False
Command2.Enabled = True
Pos = CompFile(Text1.Text, Text2.Text)
Command1.Enabled = True
Command2.Enabled = False
Select Case Pos
Case -2
MsgBox "File not Exist"
Case -1
MsgBox "User Cancel"
Case 1
MsgBox "Len Error"
Case 0
MsgBox "Compare OK"
Case Else
MsgBox "Compare Fail in " & Pos
End Select
End Sub
Private Function CompFile(File1 As String, File2 As String) As Long
Dim i As Long, k As Long
Dim Pos As Long, EventsNum As Long
Dim FileNo As Integer, FileNo1 As Integer, FileLast() As Byte, FileLast1() As Byte
Dim AllLen As Long, OneLen As Integer, BufLen As Long

'Long型比对
Dim Buf() As Long, Buf1() As Long
BufLen = 8192
OneLen = 4

'Byte型比对
'Dim Buf() As Byte, Buf1() As Byte
'BufLen = 25600
'Onelen = 1

Dim t As Single
t = Timer - 0.1 '减 0.1 是防止测速运算的除零错误,同时也能消除点缓存对测速的影响

If Dir(File1) = "" Or Dir(File2) = "" Or File1 = "" Or File2 = "" Then CompFile = -2: Exit Function
CencelCopy = False
FileNo = FreeFile
Open File1 For Binary Access Read As #FileNo
AllLen = LOF(FileNo)
Pos = 1
EventsNum = 1
FileNo1 = FreeFile
Open File2 For Binary Access Read As #FileNo1
If LOF(FileNo1) <> AllLen Then CompFile = 1: GoTo ext
ReDim Buf(BufLen - 1)
ReDim Buf1(BufLen - 1)
Do While Pos + BufLen * OneLen - 1 <= AllLen
Get #FileNo, , Buf
Get #FileNo1, , Buf1
For k = 0 To UBound(Buf)
If Buf(k) <> Buf1(k) Then
CompFile = Pos + k * OneLen
' ReDim FileLast(3) '若想精确定位不同处在哪个字节,可加上这段
' ReDim FileLast1(3)
' CopyMemory FileLast(0), Buf(k), 4
' CopyMemory FileLast1(0), Buf1(k), 4
' For i = 0 To 3
' If FileLast(i) <> FileLast1(i) Then Exit For
' Next
' CompFile = CompFile + i
GoTo ext
End If
Next
If EventsNum Mod 10 = 0 Then
Cls
Print Pos, Round(Timer - t, 2), Round((Pos / (Timer - t)) / 1024, 2) & "KB/S"
DoEvents
If CencelCopy Then CompFile = -1: GoTo ext
End If
EventsNum = EventsNum + 1
Pos = Pos + BufLen * OneLen
Loop
ReDim FileLast(AllLen - Pos)
ReDim FileLast1(AllLen - Pos)
Get #FileNo, , FileLast
Get #FileNo1, , FileLast1
For k = 0 To UBound(FileLast)
If FileLast(k) <> FileLast1(k) Then CompFile = Pos + k: GoTo ext
Next
Pos = AllLen
ext:
Close #FileNo1
Close #FileNo
CencelCopy = True
Cls
Print Pos, Round(Timer - t, 2), Round((Pos / (Timer - t)) / 1024, 2) & "KB/S"

End Function
Private Sub Command2_Click()
CencelCopy = True
End Sub

Private Sub Form_Load()
CencelCopy = True
Command1.Enabled = True
Command2.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
If CencelCopy = False Then
CencelCopy = True
Cancel = 1
End If
End Sub
tztz520 2004-11-17
  • 打赏
  • 举报
回复
'楼主可以抽取几段来判断呀'

For I = 0 To 10
If nBuf(I) <> nBuf1(I) Then
MsgBox "两个文件不一样"
Exit Sub
End If
Next I


For I = 100 To 200
If nBuf(I) <> nBuf1(I) Then
MsgBox "两个文件不一样"
Exit Sub
End If
Next I

.
.
.
.


kmzs 2004-11-17
  • 打赏
  • 举报
回复
up
homezj 2004-11-16
  • 打赏
  • 举报
回复
文件对比,用字节比对会很慢的,tztz520(午夜逛街)的代码只适于小文件,对于大文件,一定要用定长缓存循环读,否则系统会报死的。

应该充分利用32位CPU的字长,一次比对四个字节,这一说,我想大家会想到了,Long型变量正合适,这也CPU处理最快的数据类型,所以,使用Long型数组是个优化方案。

不过,还要注意一个缓存大小的问题,在我的机器上,源文件200M,当缓存定为4K时(即1024长的Long数组)异盘复制速度只有3-4MB/S,当缓存定为40K时复制速度达到21-24MB/S,与系统转存速度相当了。再大,反而开始下降。我想不同机器可能也会有所不同。

最关键一点:就是不知为什么,缓存一定要是1024的整数倍,即使差一个字节,速度也会相差几倍,如定义40K缓存,应为redim a(10239),若写成redim a(10240)就大错特错了,速度会从21M变成7M左右。

附:其实用Long型数组与Byte数组,在文件读写速度上没有什么差距,但比较效率却可能会相差不少,因为CPU可对Long一次处理。还有,因文件长度不一定正好是4的整数倍,所以文件结尾部分,需换为Byte数组特别处理一下。
wzzxq 2004-11-16
  • 打赏
  • 举报
回复
佩服homezj(小吉)
wumylove1234 2004-11-16
  • 打赏
  • 举报
回复
mark!
TaoHuang 2004-11-16
  • 打赏
  • 举报
回复
up
caimps 2004-11-15
  • 打赏
  • 举报
回复
打开文件
挨个字符比
lxcc 2004-11-15
  • 打赏
  • 举报
回复
http://www.a1vbcode.com/app.asp?ID=1901
http://www.a1vbcode.com/download.asp?ID=1901
这个应该可以!
fhvsbgmy 2004-11-15
  • 打赏
  • 举报
回复
那就是shell喽!
lazygod 2004-11-15
  • 打赏
  • 举报
回复
读取文件内容用tztz520(午夜逛街)的代码就好了,不过应该使用定长的Byte数组循环读。然后,使用StrFind以二进制方式作比较。经过优化的这个函数对Byte数组一样管用。
kmzs 2004-11-15
  • 打赏
  • 举报
回复
一个一个字节比对很慢哦。。。有没有啥优化算法,比如抽取和比较部分字节。
加载更多回复(12)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧