Imports System.IO
Imports System.Security.Cryptography

''' <summary>
''' Ta klasa zawiera metody do porównywania plików.
''' </summary>
''' <remarks>
'''		<para>Klasa nie utrzymuje informacji o stanie. Nie jest jednak
''' bezpieczna, jeśli któryś z plików został już otwarty przez inny
''' proces.</para>
'''		<para>Klasa zawiera następujące metody:</para>
'''		<list type="bullet">
'''			<item><see cref="FileComparer.TestIfTwoFilesMatch"/>
''' TestifTwoFilesMatch() porównuje dwa pliki na podstawie ich skrótów.</item>
'''		</list>
''' </remarks>
Public Class FileComparer
    ''' <summary>
    ''' Ta funkcja spradza, czy dwa pliki
    ''' mają dokładnie taką samą treść.
    ''' </summary>
    ''' <param name="fileA">Zawiera pełną ścieżkę do pierwszego pliku.</param>
    ''' <param name="fileB">Zawiera pełną ścieżkę do drugiego pliku.</param>
    ''' <returns>True, jeśli pliki pasują, false jeśli nie.</returns>
    ''' <remarks>
    ''' Implementacja metody używa klas kryptograficznych do obliczenia skrótu.
    ''' Może nie jest to najwydajniejsza metoda, ale wykrywa najdrobniejsze
    ''' różnice i praktycznie nie sposób jej oszukać.
    ''' </remarks>
    Public Function TestIfTwoFilesMatch(ByVal fileA As String, _
          ByVal fileB As String) As Boolean

        ' Tworzenie obiektu obliczającego skrót
        Dim Hash As HashAlgorithm = HashAlgorithm.Create()

        ' Obliczanie skrótu pierwszego pliku
        Dim fsA As New FileStream(fileA, FileMode.Open)
        Dim HashA() As Byte = Hash.ComputeHash(fsA)
        fsA.Close()

        ' Obliczanie skrótu drugiego pliku
        Dim fsB As New FileStream(fileB, FileMode.Open)
        Dim HashB() As Byte = Hash.ComputeHash(fsB)
        fsB.Close()

        ' Porównywanie skrótów
        Return (Convert.ToString(HashA) = Convert.ToString(HashB))

    End Function

End Class
