投稿日 | : 2006/10/06(Fri) 00:38 |
投稿者 | : も |
Eメール | : |
URL | : |
タイトル | : Re: バイナリファイルの比較 |
ちょっと私も後で使うので、作ってみました(少しだけテスト完了)
テストとしては「DataBlockLenの整数倍にならないファイルの終端1バイトだけ変えたファイルをFalseとみなすか」というものしかやってません
Public Function CompareFileData(ByVal FilePath1 As String, ByVal FilePath2 As String) As Boolean
'FilePath1とFilePath2の示すファイルのデータが等しければ真、等しくなければ偽
Const DataBlockLen As Long = 1024& * 10 '10KBのブロックデータとして扱う
Dim ff1 As Integer
Dim ff2 As Integer
Dim FileLength As Long
Dim i As Long
Dim k As Long
Dim buf1() As Byte
Dim buf2() As Byte
ReDim buf1(1 To DataBlockLen), buf2(1 To DataBlockLen)
'デフォルトでFalseを返す
CompareFileData = False
'ファイルの存在確認
If Not (ExistFile(FilePath1) And ExistFile(FilePath2)) Then Exit Function
'ファイル長の確認
FileLength = FileLen(FilePath1)
If Not (FileLength = FileLen(FilePath2)) Then Exit Function
'ファイルデータの確認
ff1 = FreeFile(): Open FilePath1 For Binary Access Read As ff1
ff2 = FreeFile(): Open FilePath2 For Binary Access Read As ff2
For i = 1 To FileLength Step DataBlockLen
If FileLength - i + 1 < DataBlockLen Then
'ファイルの橋を切り詰める ※不必要かも
ReDim buf1(1 To FileLength - i + 1), buf2(1 To FileLength - i + 1)
End If
Get #ff1, i, buf1()
Get #ff2, i, buf2()
For k = LBound(buf1) To UBound(buf1)
If Not (buf1(k) = buf2(k)) Then
'等しくない
Exit Function
End If
Next
Next
Close ff1, ff2
'ファイルのデータは等しかった
CompareFileData = True
End Function
Private Function ExistFile(ByVal FilePath As String) As Boolean
On Error GoTo Error:
ExistFile = Not (GetAttr(FilePath) And vbDirectory)
Error:
'ファイルではない
End Function