File compare en mode console en vb.net

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 918 fois - Téléchargée 41 fois


Contenu du snippet

Un outil de comparaison de fichiers, mais cette fois ci en mode console et plus rapide au niveau de l'execution (mais les lignes s'affichent 300 par 300)

Source / Exemple :


Imports System.IO
Module Module1

    Sub Main()
        Dim strinput As String
        Dim i As Integer
        Dim array(Environment.GetCommandLineArgs.GetUpperBound(0)) As String
        For i = 0 To Environment.GetCommandLineArgs.GetUpperBound(0)
            array(i) = Environment.GetCommandLineArgs(i)
        Next i
        If array.GetUpperBound(0) <> 2 Then
            Console.WriteLine("Vous devez lancer deux fichiers en arguments")
            GoTo fin
        End If
        If IO.File.Exists(array(1)) And IO.File.Exists(array(2)) Then
            Dim chemin1 As String = array(1)
            Dim chemin2 As String = array(2)
            '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 As String = ""
            If F_array1.GetUpperBound(0) <> F_array2.GetUpperBound(0) Then
                Console.WriteLine("Les deux fichiers ne font pas la meme taille, voulez vous tout de meme les comparer? O/N")
                While (nnn.ToUpper <> "N" And nnn.ToUpper <> "O")
                    nnn = Console.ReadLine.ToString
                End While

                If nnn.ToUpper = "N" Then GoTo fin
                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
            Console.WriteLine("  offset" & "    " & "File 1" & "       " & "File 2" & "       " & "Pos")

            For n = 0 To mini
                If F_array1(n) <> F_array2(n) Then 'si les deux octets sont differents :
                    If CDec(n / 300) = Int(n / 300) And n / 300 <> 0 Then strinput = UCase(Console.ReadLine())
                    Console.WriteLine("0x" & Hex(n).ToString.PadLeft(8, "0") & "     " & Hex(F_array1(n)).ToString.PadLeft(2, "0") & "        " & Hex(F_array2(n)).ToString.PadLeft(2, "0") & "        " & n.ToString)
                End If
            Next
            If maxi = mini Then GoTo fin ' on sort de la procedure si les fichiers font la meme tailles

            If smallestfile = 2 Then 'si le fichier2 etait le plus gros alors :
                Console.WriteLine("Fin du fichier 2")
                strinput = UCase(Console.ReadLine())
                For n = mini + 1 To maxi
                    If CDec(n / 300) = Int(n / 300) Then strinput = UCase(Console.ReadLine())
                    Console.WriteLine("0x" & Hex(n).ToString.PadLeft(8, "0") & "     " & Hex(F_array1(n)).ToString.PadLeft(2, "0") & "        " & "E O F" & "        " & n.ToString)
                Next
            Else 'si le fichier 1 etait le plus gros alors :
                Console.WriteLine("Fin du fichier 2")
                strinput = UCase(Console.ReadLine())
                For n = mini + 1 To maxi
                    Console.WriteLine("0x" & Hex(n).ToString.PadLeft(8, "0") & "     " & "E O F" & "        " & Hex(F_array2(n)).ToString.PadLeft(2, "0") & "        " & n.ToString)
                    If CDec(n / 300) = Int(n / 300) Then strinput = UCase(Console.ReadLine())
                Next
            End If
            Console.WriteLine("Comparaison terminée")
fin:

            Console.WriteLine("Tappez QUIT pour quitter l'application")
            While strinput <> "QUIT"
                strinput = UCase(Console.ReadLine())
            End While
        End If
    End Sub
End Module

Conclusion :


j'ajouterais surement un system de log dans un fichier... mais la j'ai envie de dormir ^^

A voir également

Ajouter un commentaire

Commentaires

OneHacker
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1 -
Je vois pas en quoi il y a honte d'utiliser des goto, euh par contre je voulais savoir si avec ce code on peut lire la sortie de son console.output ou d'un autre console.output externe, moi ca me mettais une erreur comme quoi on peut pas lire mais écrire.
Arkeur
Messages postés
9
Date d'inscription
vendredi 17 mai 2002
Statut
Membre
Dernière intervention
6 mars 2003
-
Honte à toi ! Tu utilises encore des Go To ... Il n'y a pas assez de fonctions/méthodes qui te permette d'éviter des GoTo ?!!! Révise ton code.
hvb
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1 -
... je savais pas écrire hier...
hvb
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1 -
... je savais pas écrire hier...
hvb
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1 -
pour le compiler, soit vous créer un nouveazu projet "Console Apllication" ou vous enregistrez le tout dans un fichier avec l'extension .vb puis lancez la commande "vbc votrefichier.vb" dans demarrerexecuter ... (il faut avoir au prealable copier vbc.exe dans le dossier windows, sinon il faudra tapper tout son chemin, il est de base dans le repertoire du framework)

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.