Voila donc une petite procedure de File Compare, les resulats se placent dans une listview nommée Listview1, avec 4 colonnes.
Source / Exemple :
'Cela a été un peu allongé au niveau du code, et ce en partit parcque je gere les fichiers de tailles differentes, ce qui à mes besoins actuels n'était pas tres souvent necessaire, mais bon, ca ne change pas la vitesse d'execution du code si ce n'est pas le cas (à deux instructions conditionneles pres)
'L'execution du code elle, est plutot rapide, mais l'affichage des bytes devient assez lourds si par exemple vos deux fichiers de 100Ko sont completement differents... néanmoins j'affiche des informations formattée et convertie, pour un resultat optimal ce serait facilement modifiable
'chronometrez donc la lecture des fichiers et la comparaison sans affichage avec celle de base postée ici, la difference fait mal lol. peut etre à revoir donc...
Private Sub compare_fileview(ByVal chemin1 As String, ByVal chemin2 As String)
'On commence par lire les deux fichiers dans un tableau de bytes
Dim hbread1 As New BinaryReader(File.OpenRead(chemin1)) 'on defini les deux objets de lecture de fichier
Dim hbread2 As New BinaryReader(File.OpenRead(chemin2)) ' ""
Dim smallestfile As Integer
Dim F_array1(FileLen(chemin1) - 1) As Byte 'on defini les deux tableaux de bytes de la taille du fichier selectionné
Dim F_array2(FileLen(chemin2) - 1) As Byte ' ""
hbread1.BaseStream.Seek(0, SeekOrigin.Begin) 'on defini le pointeur en debut de fichier
hbread1.Read(F_array1, 0, FileLen(chemin1)) 'on lit le fichier entier dans le tableau 1
hbread1.BaseStream.Flush() 'on libere le buffer
hbread1.Close() 'on ferme l'objet
hbread2.BaseStream.Seek(0, SeekOrigin.Begin) 'on defini le pointeur en debut de fichier
hbread2.Read(F_array2, 0, FileLen(chemin2)) 'on lit le fichier entier dans le tableau 2
hbread2.BaseStream.Flush() 'on libere le buffer
hbread2.Close() 'on ferme l'objet
Dim maxi As Long
Dim mini As Long
'Ce qui suit ne concerne que les "file compare" de fichiers de tailles differentes
Dim nnn
If F_array1.GetUpperBound(0) <> F_array2.GetUpperBound(0) Then
nnn = MsgBox("Les deux fichiers ne font pas la meme taille, voulez vous tout de meme les comparer?", MsgBoxStyle.YesNo)
If nnn = vbNo Then Exit Sub
If F_array1.GetUpperBound(0) < F_array2.GetUpperBound(0) Then
maxi = F_array2.GetUpperBound(0)
mini = F_array1.GetUpperBound(0)
smallestfile = 1
Else
maxi = F_array1.GetUpperBound(0)
mini = F_array2.GetUpperBound(0)
smallestfile = 2
End If
Else
'si les fichiers sont de meme tailles, mini et maxi sont egaux (j'aurais donc pu aussi prendre la valeur du 2eme tableau)
maxi = F_array1.GetUpperBound(0)
mini = F_array1.GetUpperBound(0)
End If
Dim n As Long
For n = 0 To mini
If F_array1(n) <> F_array2(n) Then 'si les deux octets sont differents :
With ListView1.Items.Add("0x" & Hex(n).ToString.PadLeft(8, "0")) 'ajoute l'offset en valeur hexa sous la forme 0x00000000 dans la premiere colonne
.SubItems.Add(Hex(F_array1(n)).ToString.PadLeft(2, "0")) 'ajoute la valeur hexa de l'octet different du fichier 1 sous la forme 00
.SubItems.Add(Hex(F_array2(n)).ToString.PadLeft(2, "0")) 'ajoute la valeur hexa de l'octet different du fichier 2 sous la forme 00
.SubItems.Add(n.ToString) 'ajoute l'offset en valeur decimal (base 10)
End With
End If
Next
If maxi = mini Then Exit Sub ' on sort de la procedure si les fichiers font la meme tailles
If smallestfile = 2 Then 'si le fichier2 etait le plus gros alors :
For n = mini + 1 To maxi
With ListView1.Items.Add("0x" & Hex(n).ToString.PadLeft(8, "0"))
.SubItems.Add(Hex(F_array1(n)).ToString.PadLeft(2, "0"))
.SubItems.Add("E O F")
.SubItems.Add(n.ToString)
End With
Next
Else 'si le fichier 1 etait le plus gros alors :
For n = mini + 1 To maxi
With ListView1.Items.Add("0x" & Hex(n).ToString.PadLeft(8, "0"))
.SubItems.Add("E O F")
.SubItems.Add(Hex(F_array2(n)).ToString.PadLeft(2, "0"))
.SubItems.Add(n.ToString)
End With
Next
End If
End Sub
Conclusion :
voila, si vous avez des ammeliorations,suggestions ou critiques à donner, je suis preneur.. :)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.