トップ  >  サンプルソース  >  フォルダ比較(VB.NET)

フォルダ比較(VB.NET)

2010年01月09日

2つのフォルダ内の全てのファイルを比較するサンプル(ソース/コード)です。ファイル更新日時やファイルサイズやファイル内容で比較しますが、このサンプルはファイル更新日時比較とファイルサイズ比較をコメントにしています。#版を作っていないのはVB専用だからでは無く面倒だったからです。移植可能です。

※フォルダ比較関係のツールやサンプルはこちら「フォルダ比較関係」です。

' ----------------------------------------------------------
' フォルダを比較するサンプル(VB.NET/VS2005)
Private Sub Button1_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click

    ' 比較するPATH設定
    Dim pt1 As String = "D:\Temp\Html1"
    Dim pt2 As String = "D:\Temp\Html2"

    ' 比較フォルダのファイル情報の一覧取得
    Dim ls1 As String() = GetFList(pt1)
    Dim ls2 As String() = GetFList(pt2)

    ' フォルダ比較
    Dim fcm As String() = _
        FolderCompare(pt1, ls1, pt2, ls2)

    ' 結果表示
    For i As Integer = 0 To UBound(fcm)
        Debug.WriteLine( _
        (i + 1).ToString("000") & ":" & fcm(i))
    Next
End Sub

' ファイル情報の一覧(PATH,日時,サイズ)を比較し
' 結果一覧(区分,PATH,日時1,日時2,サイズ1,サイズ2)を返す
' (注意)ファイル名の昇順!!各情報はタブ区切り!!
Public Function FolderCompare( _
    ByVal pt1 As String, ByVal ls1 As String(), _
    ByVal pt2 As String, ByVal ls2 As String()) As String()

    If pt1.Substring(pt1.Length - 1, 1) <> "\" Then pt1 = pt1 & "\"
    If pt2.Substring(pt2.Length - 1, 1) <> "\" Then pt2 = pt2 & "\"

    Dim fc As String() = New String(-1) {}
    Dim p1 As Long = 0
    Dim p2 As Long = 0
    Do
        ' ファイル1の情報(PATH,日時,サイズ)
        Dim fd1 As String() = New String(2) {"", "", ""}
        ' ファイル2の情報(PATH,日時,サイズ)
        Dim fd2 As String() = New String(2) {"", "", ""}
        ' 更新タイプ(0:同じ,1:追加,2:削除,3:更新)
        Dim upd As Integer = 0

        If p1 >= ls1.Length Then
            If p2 >= ls2.Length Then
                ' 比較完了
                Exit Do
            Else
                ' 追加ファイル発見
                fd2 = Split(ls2(p2) & vbTab & vbTab, vbTab)
                fd2(0) = fd2(0).Replace(pt2, "")
                upd = 1
            End If
        ElseIf p2 >= ls2.Length Then
            If p1 >= ls1.Length Then
                ' 比較完了
                Exit Do
            Else
                ' 削除ファイル発見
                fd1 = Split(ls1(p1) & vbTab & vbTab, vbTab)
                fd1(0) = fd1(0).Replace(pt1, "")
                upd = 2
            End If
        Else
            fd1 = Split(ls1(p1) & vbTab & vbTab, vbTab)
            fd2 = Split(ls2(p2) & vbTab & vbTab, vbTab)
            fd1(0) = fd1(0).Replace(pt1, "")
            fd2(0) = fd2(0).Replace(pt2, "")
            If String.Compare(fd1(0), fd2(0)) > 0 Then
                ' 追加ファイル発見
                upd = 1
            ElseIf String.Compare(fd1(0), fd2(0)) < 0 Then
                ' 削除ファイル発見
                upd = 2
            Else
                ' ファイルの更新日時を比較する
                'If upd = 0 Then
                '    Dim dt1 As DateTime = Nothing
                '    Dim dt2 As DateTime = Nothing
                '    If IsDate(fd1(1)) Then dt1 = fd1(1)
                '    If IsDate(fd2(1)) Then dt2 = fd2(1)
                '    If dt1 <> dt2 Then
                '        ' 更新ファイル発見
                '        upd = 3
                '    End If
                'End If
                ' ファイルのサイズを比較する
                'If upd = 0 Then
                '    Dim sz1 As Integer = -1
                '    Dim sz2 As Integer = -1
                '    If IsNumeric(fd1(2)) Then sz1 = fd1(2)
                '    If IsNumeric(fd2(2)) Then sz2 = fd2(2)
                '    If sz1 <> sz2 Then
                '        ' 更新ファイル発見
                '        upd = 3
                '    End If
                'End If
                ' ファイルの中身を比較する
                If upd = 0 Then
                    If FileCompare( _
                        pt1 & fd1(0), _
                        pt2 & fd2(0)) = False Then
                        ' 更新ファイル発見
                        upd = 3
                    End If
                End If
            End If
        End If

        ' 結果一覧へ追加
        Dim fn As String = fd1(0) ' ファイルPATH
        Dim od As String = fd1(1) ' ファイル更新日時1
        Dim nd As String = fd2(1) ' ファイル更新日時2
        Dim os As String = fd1(2) ' ファイルサイズ1
        Dim ns As String = fd2(2) ' ファイルサイズ2

        If upd = 0 Then
            ' 同じファイルの情報
            Dim recdt As String = fn & vbTab & _
                od & vbTab & nd & vbTab & _
                os & vbTab & ns
            ReDim Preserve fc(UBound(fc) + 1)
            fc(UBound(fc)) = "___" & vbTab & recdt
            p1 += 1
            p2 += 1
        ElseIf upd = 1 Then
            ' 追加ファイルの情報
            fn = fd2(0)
            Dim recdt As String = fn & vbTab & _
                "" & vbTab & nd & vbTab & _
                "" & vbTab & ns
            ReDim Preserve fc(UBound(fc) + 1)
            fc(UBound(fc)) = "ADD" & vbTab & recdt
            p2 += 1
        ElseIf upd = 2 Then
            ' 削除ファイルの情報
            Dim recdt As String = fn & vbTab & _
                od & vbTab & "" & vbTab & _
                os & vbTab & ""
            ReDim Preserve fc(UBound(fc) + 1)
            fc(UBound(fc)) = "DEL" & vbTab & recdt
            p1 += 1
        ElseIf upd = 3 Then
            ' 更新ファイルの情報
            Dim recdt As String = fn & vbTab & _
                od & vbTab & nd & vbTab & _
                os & vbTab & ns
            ReDim Preserve fc(UBound(fc) + 1)
            fc(UBound(fc)) = "UPD" & vbTab & recdt
            p1 += 1
            p2 += 1
        End If
    Loop
    Return fc
End Function

' ファイルの中身を比較し結果(True:同じ)を返す
Public Function FileCompare( _
    ByVal f1 As String, _
    ByVal f2 As String) As Boolean
    ' ファイル1をバイナリ形式で読み込む
    Dim dt1 As Byte() = FileRead_Bin(f1)
    ' ファイル2をバイナリ形式で読み込む
    Dim dt2 As Byte() = FileRead_Bin(f2)
    ' サイズを比較
    If dt1.Length <> dt2.Length Then Return False
    ' 中身を比較
    For i As Integer = 0 To UBound(dt1)
        If dt1(i) <> dt2(i) Then Return False
    Next
    Return True
End Function

' ファイルをバイナリ形式で読み込むByte配列で返す
Public Function FileRead_Bin( _
    ByVal f1 As String) As Byte()
    Dim sr As System.IO.Stream = _
        System.IO.File.Open(f1, _
        System.IO.FileMode.Open, _
        System.IO.FileAccess.Read)
    Dim br As System.IO.BinaryReader = _
        New System.IO.BinaryReader(sr)
    Dim dt As Byte() = New Byte(sr.Length - 1) {}
    br.Read(dt, 0, dt.Length)
    br.Close()
    sr.Close()
    Return dt
End Function
' ----------------------------------------------------------
スポンサーサイト

WEBページの差分(VB.NET) | トップページへ戻る | ファイル一覧取得(VB.NET)

このページのトップに戻る

コメント

名前
題名
メールアドレス
WEBサイト
 
コメント
パスワード
  管理者にだけ表示を許可する

このページのトップに戻る

トラックバック

このページのトップに戻る