[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/10/05(Thu) 23:03
投稿者名:つぼちゃん
Eメール:
URL :
タイトル:
バイナリファイルの比較
バイナリファイルの比較を行いたいのですが、どのようにして行えばよいでしょうか。
ネットで検索し、以下のようなサンプルがあり、これでいけるのではないかという意見がありましたが、Do While のループの中に入らずにスルーしてしまいます。

Dim buf1(1) As Byte
Dim buf2(1) As Byte
Open "ホゲホゲ1.wav" For Binary As #1
Open "ホゲホゲ2.wav" For Binary As #2
Get #1, , buf1
Get #2, , buf2
Do While Not EOF(1)
  データ比較処理
Loop
Close #1,#2

ちなみに実際に比較したいのはjpgファイルで、同じか違うかだけ比較できればよいです。

投稿時間:2006/10/05(Thu) 23:04
投稿者名:つぼちゃん
Eメール:
URL :
タイトル:
Re: バイナリファイルの比較
VB6+WinXPです。

投稿時間:2006/10/05(Thu) 23:25
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: バイナリファイルの比較
> バイナリファイルの比較を行いたいのですが、どのようにして行えばよいでしょうか。

ハッシュ値を比較するとか。
http://www.hi-ho.ne.jp/babaq/basp21.html

  Const FromString As Integer = 0
  Const FromFile As Integer = 1

  Dim S(1) As String
  With CreateObject("BASP21")
    S(0) = .MD5("C:\001.JPG", FromFile)
    S(1) = .MD5("C:\002.JPG", FromFile)
  End With

  If S(0) = S(1) Then
    MsgBox "同じファイルです。"
  Else
    MsgBox "異なるファイルです。"
  End If

投稿時間:2006/10/06(Fri) 00:18
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: バイナリファイルの比較
 こんな感じでもOKです。ファイルを読む前に、ファイルサイズのチェックをしたほうが
まともでしょうが、適当に直して使ってください。


Dim bytBuf1() As Byte
Dim bytBuf2() As Byte

    Open "ホゲホゲ1.wav" For Binary As #1
    Open "ホゲホゲ2.wav" For Binary As #2
    bytBuf1 = InputB(LOF(1), #1)
    bytBuf2 = InputB(LOF(2), #2)
    Close #1, #2
    
    If CStr(bytBuf1) = CStr(bytBuf2) Then
        MsgBox "同じです。"
    Else
        MsgBox "違います。"
    End If

投稿時間: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

投稿時間:2006/10/06(Fri) 09:51
投稿者名:つぼちゃん
Eメール:
URL :
タイトル:
お礼
魔界の仮面弁士さん、Starfishさん、もさん

コーディングが簡単な面などから、Starfishさんのものを使用し、無事比較することができました。
ありがとうございました。