Accés binaire : comparer deux fichiers en vb.net

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 202 fois - Téléchargée 41 fois


Contenu du snippet

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.. :)

A voir également

Ajouter un commentaire

Commentaires

cs_Patrice99
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018
-
Pour ce genre de chose, il vaux mieux calculer une distance d'édition, c'est à dire un matching entre les deux fichiers, un bon exemple est Windiff, un utilitaire fournis avec Visual Studio 6, car les zones qui se correspondent sont clairement indiquées.
mebilo
Messages postés
8
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
23 août 2004
-
pas de fichiers en accompagnement, dommage...

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.