Public Class CompareFilesForm
Private Structure CompareResult
Public Message As String
Public Graph As Image
End Structure
Private Colors As New List(Of Color)
Private Sub CreateColors()
Dim R, G, B As Int16
R = 0
G = 0
B = 0
R = 255
For G = 0 To 255
Colors.Add(Color.FromArgb(255, R, G, B))
Next
G = 255
For R = 255 To 1 Step -1
Colors.Add(Color.FromArgb(255, R, G, B))
Next
G = 255
For B = 0 To 255
Colors.Add(Color.FromArgb(255, R, G, B))
Next
B = 255
For G = 255 To 1 Step -1
Colors.Add(Color.FromArgb(255, R, G, B))
Next
End Sub
Private Function CreateLegend() As Image
Dim Result As New Bitmap(Colors.Count, 21)
Dim G As Graphics = Graphics.FromImage(Result)
For I As Int16 = 0 To Colors.Count - 1
G.DrawLine(New Pen(Colors(I)), I, 0, I, 21)
Next
Return Result
End Function
Sub New()
Me.InitializeComponent()
CreateColors()
imgLegend.Image = CreateLegend()
End Sub
Private Sub btnFirstBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirstBrowse.Click, btnSecondBrowse.Click
Dim Open As New OpenFileDialog
Open.Filter = "Tutti i file|*.*"
If Open.ShowDialog = Windows.Forms.DialogResult.OK Then
If sender Is btnFirstBrowse Then
txtFirst.Text = Open.FileName
Else
txtSecond.Text = Open.FileName
End If
End If
End Sub
Private Sub btnCompare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCompare.Click
If btnCompare.Text = "Compara" Then
If (Not IO.
File.
Exists(txtFirst.
Text)) Or
(Not IO.
File.
Exists(txtSecond.
Text)) Then
MessageBox.Show("Inserire due file validi ed esistenti!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
btnCompare.Text = "Ferma"
btnFirstBrowse.Enabled = False
btnSecondBrowse.Enabled = False
Files = New String() {txtFirst.
Text, txtSecond.
Text, nudBlockSize.
Value}
bgCompare.
RunWorkerAsync(Files)
Else
bgCompare.CancelAsync()
btnCompare.Text = "Compara"
btnSecondBrowse.Enabled = True
btnFirstBrowse.Enabled = True
End If
End Sub
Private Sub bgCompare_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgCompare.DoWork
Dim BiggerFile As String
Dim SmallerFile As String
If FileLen(e.Argument(0)) > FileLen(e.Argument(1)) Then
BiggerFile = e.Argument(0)
SmallerFile = e.Argument(1)
Else
BiggerFile = e.Argument(1)
SmallerFile = e.Argument(0)
End If
Dim Reader1 As New IO.FileStream(BiggerFile, IO.FileMode.Open)
Dim Reader2 As New IO.FileStream(SmallerFile, IO.FileMode.Open)
Dim B1, B2 As Byte
Dim SameBytes, DifferentBytes As Int32
Dim BlockSameBytes, BlockDifferentBytes As Int32
Dim Percentages As New List(Of Single)
Dim BlockSize As Int32 = CInt(e.Argument(2))
Do While (Reader2.Position < Reader2.Length - 1)
B1 = Reader1.ReadByte
B2 = Reader2.ReadByte
If B1 = B2 Then
SameBytes += 1
BlockSameBytes += 1
Else
DifferentBytes += 1
BlockDifferentBytes += 1
End If
If Reader1.Position Mod BlockSize = 0 Then
Percentages.Add(100 * BlockSameBytes / (BlockSameBytes + BlockDifferentBytes))
BlockSameBytes = 0
BlockDifferentBytes = 0
End If
bgCompare.ReportProgress(100 * Reader2.Position / Reader2.Length)
Loop
If Reader2.Length < Reader1.Length Then
For I As Int16 = 1 To Math.Ceiling((Reader1.Length - Reader2.Length) / BlockSize)
Percentages.Add(0)
Next
End If
Reader1.Close()
Reader2.Close()
Dim Graph As New Bitmap(Percentages.Count, 53)
Dim G As Graphics = Graphics.FromImage(Graph)
For I As Int32 = 0 To Percentages.Count - 1
G.DrawLine(New Pen(Colors((Colors.Count - 1) * Percentages(I) / 100)), I, 0, I, 53)
Next
Dim Result As New CompareResult
Result.Message = String.Format("Risultato: {0:N2}% dei file uguali", 100 * SameBytes / (SameBytes + DifferentBytes))
Result.Graph = Graph
e.Result = Result
End Sub
Private Sub bgCompare_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgCompare.ProgressChanged
prgProgress.Value = e.ProgressPercentage
End Sub
Private Sub bgCompare_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgCompare.RunWorkerCompleted
If e.Cancelled Then
MessageBox.Show("Comparazione annullata!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
Dim Result As CompareResult = e.Result
lblResult.Text = Result.Message
imgCompared.Image = Result.Graph
MessageBox.Show("Comparazione completata!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
btnCompare.Text = "Compara"
btnSecondBrowse.Enabled = True
btnFirstBrowse.Enabled = True
End Sub
Private Sub imgCompared_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles imgCompared.Click
Dim Save As New SaveFileDialog
Save.Filter = "File immagine|*.png;*.jpg;*.gif;*.bmp;*.wmf"
If Save.ShowDialog = Windows.Forms.DialogResult.OK Then
imgCompared.Image.Save(Save.FileName)
End If
End Sub
End Class