Rubrik: Dateisystem · Dateien - allgemein | VB-Versionen: VB.NET | 17.10.07 |
Dateien miteinander vergleichen (VB.NET) Sind zwei Dateien identisch? Diese Frage lässt sich nicht immer beantworten, wenn man nur die reine Dateigröße miteinander vergleicht. | ||
Autor: Dieter Otter | Bewertung: | Views: 22.675 |
www.tools4vb.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Um zu prüfen, ob zwei Dateien identisch sind, sollte man folgendermassen vorgehen:
- Vergleich der Dateigrößen
- Haben beide Dateien die gleiche Größe, muss der Inhalt miteinander verglichen werden
Die Funktion FileCompare erledigt genau diese Aufgabe für Sie. Das notwendige Vergleichen der Datei-Inhalte erfolgt über die jeweiligen Hash-Werte.
Rückgabewert der Funktion:
0 - Identical
1 - SizeDifferent
2 - ContentsDifferent
3 - Error
Imports System.IO Imports System.Security.Cryptography
Private Enum FileCompareStatus Identical = 0 ' identisch SizeDifferent = 1 ' Dateigröße verschieden ContentDifferent = 2 ' Inhalt verschieden [Error] = 3 ' Fehler End Enum
' zwei Dateien miteinander vergleichen Private Function FileCompare(ByVal sFile1 As String, _ ByVal sFile2 As String) As FileCompareStatus ' Prüfen, ob beide Dateien auch existieren If File.Exists(sFile1) AndAlso File.Exists(sFile2) Then Try ' zunächst Dateigröße vergleichen If New FileInfo(sFile1).Length <> New FileInfo(sFile2).Length Then Return FileCompareStatus.SizeDifferent Else ' jetzt Hash-Wert berechnen und vergleichen Dim oHash As HashAlgorithm = HashAlgorithm.Create Dim oStream As FileStream ' Hash-Wert für 1. Datei ermitteln oStream = New FileStream(sFile1, FileMode.Open) Dim bHash1() As Byte = oHash.ComputeHash(oStream) oStream.Close() ' Hash-Wert für 2. Datei ermitteln oStream = New FileStream(sFile2, FileMode.Open) Dim bHash2() As Byte = oHash.ComputeHash(oStream) oStream.Close() ' jetzt die beiden Hash Byte-Arrays miteinander vergleichen If BitConverter.ToString(bHash1) = BitConverter.ToString(bHash2) Then ' Datei-Inhalt ist identisch Return FileCompareStatus.Identical Else ' Datei-Inhalt unterscheidet sich Return FileCompareStatus.ContentDifferent End If End If Catch ex As Exception ' Fehler Return FileCompareStatus.Error End Try Else Return FileCompareStatus.Error End If End Function
Um die neue Funktion gleich auszuprobieren, erstellen Sie ein neues Projekt und plazieren auf die Form einen CommandButton (Button1) und ein Label-Control (lblStatus) und fügen obigen Code in den Codeteil der Form ein.
Beim Klicken auf den CommandButton wird folgender Code ausgeführt:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' Hier die beiden Dateien festlegen Dim sFile1 As String = "c:\temp\datei1.ext" Dim sFile2 As String = "c:\temp\datei2.ext" Select Case FileCompare(sFile1, sFile2) Case FileCompareStatus.Identical lblStatus.Text = "Die Dateien sind identisch!" Case FileCompareStatus.SizeDifferent lblStatus.Text = "Die Dateien haben unterschiedliche Dateigrößen!" Case FileCompareStatus.ContentDifferent lblStatus.Text = "Die Dateien haben unterschiedlichen Inhalt!" Case FileCompareStatus.Error lblStatus.Text = "Fehler beim Dateivergleich!" End Select End Sub