Application client/serveur (mise à jour MD5)

Fermé
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013 - 15 août 2011 à 12:09
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013 - 24 août 2011 à 12:37
Bonjour à tous, je suis un gros débutant sur visual studio, j'aurai aimé avoir quelques informations.

Tout d'abord je souhaite créer une application qui permette en plus de ses fonctionnalités (boutons de lancement d'applications par exemple) de servir d'auto updater. Je vous explique, le principe serait qu'à chaque lancement de l'application, elle fasse les mises à jours disponibles automatiquement si la partie client n'est pas à jour.
J'ai donc pensé à un principe:

1)L'application va voir à une adresse (ex: [url]http://www.monsite.fr/updater/liste.txt/url )

2)Nous avons donc un fichier liste.txt hébergé sur un serveur, celui ci contient la liste de tous les derniers fichiers en date suivi de leur empreinte MD5.

exemple de liste.txt:
fichier1.txt 2734d8940268ac0d5a3d3be90dc895f8
fichier2.exe a4b64724173983950a615a2f20ffc054
fichier3.rar 111c49991c07f94fe30de049b6342623
/dossier1/fichier4.exe 1dffff0bf0f0c4ba4a72fbc357e53574
/dossier2/fichier5.exe 812bd3810c0f12592ad197a33964d159


3)Les fichiers correspondants sont hébergés sur le même serveur dans un dossier qui contient tous les fichiers du liste.txt, tous les fichiers du dernier client à jour alors. (exemple: [url]http://www.monsite.fr/updater/application//url)

4)L'application compare les empreintes MD5 des fichiers du client avec ceux du fichier liste.txt hébergé sur le site. Si les fichiers n'existent pas ou si l'empreinte MD5 n'est pas la même, l'application télécharge le ou les fichiers qu'il faut (ceux qui sont hébergés sur le site: [url]http://www.monsite.fr/updater/application//url )

5)Si toutes les empreintes MD5 correspondent ou lorsque l'application a fini de télécharger les derniers fichiers les boutons se dévérouillent.

Ce projet est-il possible à votre avis ? Cela fonctionnerait-il ? Existe-il une autre méthode plus pertinente que la "méthode MD5" pour permettre de différencier deux fichiers sachant qu'ils auraient le même nom et quasimment si ce n'est exactement la même taille ? Et est-ce que des personnes pourraient m'aider à la réalisation de cette partie de mon application.

J'ai trouvé quelques bouts de codes:
[url]http://www.vbfrance.com/codes/CHECKSUM-SHA1-MD5-FICHIER_43669.aspx/url
[url]http://www.vbfrance.com/codes/MD5-CHECK-SUM_33257.aspx/url
[url]http://www.vbfrance.com/codes/VERIFIER-NOUVELLE-VERSION-APPLICATION-VB-PARTIR-INTERNET_39179.aspx/url

Je pense qu'ils pourraient grandement aider à la réalisation de l'application, si des gens expérimentés pouvaient me venir en aide et m'aider à réaliser cette partie de mon application je serais vraiment soulagé.

Cordialement.

28 réponses

Utilisateur anonyme
15 août 2011 à 17:10
Salut,

Voici une piste sous forme d'exemple que tu pourrais utiliser en la modifiant :

Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'si le fichier liste local existe, on le supprime
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
        End If
        'création d'une liste de tous les fichiers présents dans un dossier et ses sous dossiers
        'remplacer Application.StartupPath par le dossier racine voulu
        Dim repertoire() As IO.FileInfo = New IO.DirectoryInfo(Application.StartupPath).GetFiles("*", IO.SearchOption.AllDirectories)
        'écriture de la liste locale des fichiers 
        Using writer As New IO.StreamWriter(Application.StartupPath & "\listelocale.txt", False, System.Text.Encoding.Default)
            For Each fichier As IO.FileInfo In repertoire
                'avec leur nom et leur MD5 séparé par un espace 
                'Note: le choix de l'espace pour la séparation n'est peut-être pas judicieux
                'utiliser New Char() {Convert.ToChar(1)}  pour un meilleur séparateur
                'utilise fichier.FullName pour écrire le chemin complet du fichier
                writer.WriteLine(fichier.Name & " " & MD5File(fichier.FullName))
            Next
        End Using
        'téléchargement du fichier liste.txt distant pour la comparaison
        My.Computer.Network.DownloadFile("http://monsite.fr/liste.txt", Application.StartupPath & "\liste.txt")

        'ici tu n'a plus qu'à comparer les 2 fichiers (liste.txt et listelocale.txt)
        'utilise My.Computer.Network.DownloadFile pour mettre à jour les fichiers qui manquent ou à remplacer

    End Sub
    'fonction de hashage MD5
    Private Function MD5File(ByVal nFichier As String) As String
        Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim fmd5 As New IO.FileStream(nFichier, IO.FileMode.Open, IO.FileAccess.Read)
        MD5.ComputeHash(fmd5)
        Dim hash As Byte() = MD5.Hash
        Dim buff As System.Text.StringBuilder = New System.Text.StringBuilder
        Dim hashByte As Byte
        For Each hashByte In hash
            buff.Append(String.Format("{0:X2}", hashByte))
        Next
        MD5.Clear()
        fmd5.Close()
        fmd5.Dispose()
        Return buff.ToString
    End Function
End Class

Bonne soirée.
0
Utilisateur anonyme
15 août 2011 à 17:15
Je viens de me rendre compte que tu as donné des liens de sources en .NET mais aussi en VB6.
L'exemple ci-dessus étant pour .NET bien entendu. (vb6 étant obsolète depuis plus de 5 ans)
Bonne soirée.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
15 août 2011 à 21:32
@banana32 : Obselète, peut-être, mais installer le framework complet sur un serveur quand on n'a pas de site en ASP.NET c'est du gaspillage pur de ressources (vu que ce boulet ça s'installer comme addon dans IIS). J'ai développé pas mal d'applis en VB6, ce langage a au moins le mérite d'être fiable et léger.

C'est tout à fait faisable, montre-nous le code que tu as déjà fait et ce sur quoi tu bloques.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
15 août 2011 à 22:43
Merci de ton aide banana32, néanmoins dans ton code, le fichier listelocale.txt qui est créé ne prend pas en compte le nom des dossiers :
exemple: dans la partie client j'ai un dossier appelé "test" dans lequel il y a un fichier appelé "fichier1". Eh bien dans ce cas j'aurais écris:
fichier1 suivi de son empreinte md5
Au lieu de:
/test/fichier1 suivi de son empreinte md5.

Pour la partie qui est de comparer les deux fichiers j'ai trouvé un bout de code:

    Sub comparer()
        Me.l1.Text = ("Fichier : " & Me.Fichier1.Text)
        Me.l2.Text = ("Fichier : " & Me.Fichier2.Text)
        Dim sr1 As StreamReader = New StreamReader(Me.Fichier1.Text)
        Dim ligne1 As String
        Dim sr2 As StreamReader = New StreamReader(Me.Fichier2.Text)
        Dim ligne2 As String
        Dim Flag As Integer = 0
        Do
            ligne1 = sr1.ReadLine()
            ligne2 = sr2.ReadLine()
            If ligne1 <> ligne2 Then
                Flag += 1
                Me.lFichier1.Items.Add(ligne1)
                Me.lFichier2.Items.Add(ligne2)
            End If

        Loop Until ligne1 Is Nothing And ligne2 Is Nothing

        sr1.Close()
        sr1.Close()
        If Flag = 0 Then
            MessageBox.Show("Le contenu est la même dans les 2 fichiers", "Résultat", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Else
            MessageBox.Show(Flag & " lignes différentes trouvées", "Résultat", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End If
    End Sub


Il provient de cette page : http://www.vbfrance.com/codes/VB-NET-COMPARER-FICHIERS_27359.aspx
Cette partie du code est elle utile pour comparer deux fichiers ou non ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
15 août 2011 à 23:40
Compare-les via un MD5 vu que tu as déjà une fonction pour le faire ... Par contre pour le fichier dans un sous-rép, laisse tel-quel sinon tu auras des problèmes si tu as un fichier du même nom autre part. Et puis ce fichier est généré/vérifié automatiquement donc tu ne l'auras pas constamment sous le nez

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Utilisateur anonyme
15 août 2011 à 23:52
le fichier listelocale.txt qui est créé ne prend pas en compte le nom des dossiers

Comme je te l'ai signalé, pour inscrire le chemin complet du fichier, ecris :
writer.WriteLine(fichier.FullName & " " & MD5File(fichier.FullName))

Si ces fichiers sont dans le dossier de ton application, retranche au nom de fichier : application.startuppath.
En ce qui concerne la comparaison des fichiers je verrais bien quelque chose comme ceci (a toi de changer les chemins des fichiers)

        Using reader_loc As New IO.StreamReader(Application.StartupPath & "\listelocale.txt")
            Do While Not reader_loc.EndOfStream
                Dim l As String = reader_loc.ReadLine
                Dim l2 As String = ""
                Using reader_dist As New IO.StreamReader(Application.StartupPath & "\liste.txt")
                    Dim fichierexiste As Boolean = False
                    Do While Not reader_dist.EndOfStream
                        l2 = reader_dist.ReadLine
                        'fichiers de même nom
                        If l.Split(" "c)(0) = l2.Split(" "c)(0) Then
                            'le hash est différent
                            If l.Split(" "c)(1) <> l2.Split(" "c)(1) Then
                                My.Computer.Network.DownloadFile(l2.Split(" "c)(0), Application.StartupPath & "" & l2.Split(" "c)(0))
                            Else
                                'le hash est le même (on peut effectuer une action ici)
                            End If
                            fichierexiste = True
                        End If
                    Loop
                    If Not fichierexiste Then
                        My.Computer.Network.DownloadFile(l2.Split(" "c)(0), Application.StartupPath & "" & l2.Split(" "c)(0))
                    End If
                End Using
            Loop
        End Using

@ghuysman99 : vb6 est économe, fiable, léger ... mais obsolète. Bien à toi.

Bonne soirée à tous les 2.
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
16 août 2011 à 15:35
Encore merci à toi banana32, malgré des recherches que j'ai faite je n'ai pas vu faire ton conseil:
Si ces fichiers sont dans le dossier de ton application, retranche au nom de fichier : application.startuppath.


C'est la ligne en question je pense:

writer.WriteLine(fichier.FullName & " " & MD5File(fichier.FullName))


Et il y a un problème lors du téléchargement des fichiers manquants j'obtiens une erreur Microsoft .NET Framework : Si un fichier est déjà présent dans le dossier qui contient l'application, celle-ci s'arrête au lieu de continuer.
Et j'aurais aimé savoir si c'est normal que l'application se lance (interface) après que les fichiers liste.txt et listelocale.txt apparaissent (avant que je ne mette la deuxieme partie du code qui fait buger à la suite du téléchargement).
Enfin est-il possible de supprimer automatiquement à la fin des mises à jour les fichiers liste.txt et listelocale.txt ?
0
Utilisateur anonyme
16 août 2011 à 21:32
Re,
malgré des recherches que j'ai faite je n'ai pas vu faire ton conseil

Tu peux écrire ceci pour retrancher le chemin de ton application :
Dim fichier_p As String = fichier.FullName.Replace(Application.StartupPath, "").Substring(1)
writer.WriteLine(fichier_p & " " & MD5File(fichier.FullName))

Et il y a un problème lors du téléchargement des fichiers manquants j'obtiens une erreur Microsoft .NET Framework : Si un fichier est déjà présent dans le dossier qui contient l'application, celle-ci s'arrête au lieu de continuer.

La méthode DownloadFile propose un argument overwrite à mettre à True pour remplacer le fichier existant.
Sinon, rien ne t'empêche de supprimer les fichier comme ceci :
If My.Computer.FileSystem.FileExists(Application.StartupPath & "\liste.txt") Then
    My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\liste.txt")
End If
My.Computer.Network.DownloadFile("http://monsite.fr/liste.txt", Application.StartupPath & "\liste.txt")


Enfin est-il possible de supprimer automatiquement à la fin des mises à jour les fichiers liste.txt et listelocale.txt

Voir juste au dessus (DeleteFile)

Ta 3eme question ne devrait plus avoir lieu d'être lorsque tu aura réglé les 2 premières.

A bientôt.
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
16 août 2011 à 22:57
Ok donc le problème du chemin des applications est réglé, mais j'ai remarqué que lorsque j'essaye de lancer l'application, tout d'abord liste.txt et listelocale.txt ne sont pas supprimés bien que j'ai:

If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
    My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
End If
If My.Computer.FileSystem.FileExists(Application.StartupPath & "\liste.txt") Then
    My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\liste.txt")
End If


Et maintenant l'application ne se lance pas du tout même si je ne mets rien dans le fichier liste.txt
J'obtiens ceci (Microsoft.NET framework):
Unhandled exception has occurred in your application.
Argument cannot be Nothing.
Parameter name: address.

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.ArgumentNullException: Argument cannot be Nothing.
Parameter name: address
   at Microsoft.VisualBasic.Devices.Network.DownloadFile(String address, String destinationFileName, String userName, String password, Boolean showUI, Int32 connectionTimeout, Boolean overwrite, UICancelOption onUserCancel)
   at Microsoft.VisualBasic.Devices.Network.DownloadFile(String address, String destinationFileName)
   at WindowsApplication2.Form1.Form1_Load(Object sender, EventArgs e) in c:\users\stéphane\documents\visual studio 2010\Projects\WindowsApplication2\WindowsApplication2\Form1.vb:line 49
   at System.EventHandler.Invoke(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.237 (RTMGDR.030319-2300)
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
WindowsApplication2
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Users/St%E9phane/Documents/Visual%20Studio%202010/Projects/WindowsApplication2/WindowsApplication2/bin/Debug/WindowsApplication2.exe
----------------------------------------
Microsoft.VisualBasic
    Assembly Version: 10.0.0.0
    Win32 Version: 10.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.236 built by: RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.233 built by: RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.235 built by: RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.233 built by: RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Runtime.Remoting
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.


Et il y a un problème lors du téléchargement des fichiers manquants j'obtiens une erreur Microsoft .NET Framework : Si un fichier est déjà présent dans le dossier qui contient l'application, celle-ci s'arrête au lieu de continuer.

Lorsque je parlais de ça c'était lorsque le hash MD5 était le même dans liste.txt et listelocale.txt donc normalement il n'y aurait pas besoin de télécharger le fichier dans ce cas là.

Et enfin pour pouvoir remplacer les fichiers lorsque le hash MD5 est différent, l'argument overwrite se rajoute de cette manière par exemple ? :
My.Computer.Network.DownloadFile(l2.Split(" "c)(0), Application.StartupPath & "" & l2.Split(" "c)(0), overwrite)
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
16 août 2011 à 23:01
EDIT:Lorsque je mets un fichier dans liste.txt avec le fichier hébergé juste à côté j'obtiens aussi une erreur Microsoft.NET framework:
'fichiertest.txt' is not a valid remote file adress. A valid adress should include a protocal, a path and a file name.
Parameter name: adress.
0
Utilisateur anonyme
17 août 2011 à 15:06
Oui c'est juste un problème de chemin (path) des fichiers.
Ce n'est pas bien compliqué à régler. Je me penche dessus dès que possible. Et je mettrai des commentaires pour que tu comprenne bien
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
17 août 2011 à 15:48
Et enfin pour pouvoir remplacer les fichiers lorsque le hash MD5 est différent, l'argument overwrite se rajoute de cette manière par exemple ? :
My.Computer.Network.DownloadFile(l2.Split(" "c)(0), Application.StartupPath & "" & l2.Split(" "c)(0), overwrite)

Est-ce que c'est bon comme cela ou pas? (je ne l'ai pas encore mis dans le code)

Ok merci à toi, pour t'aider je te mets ce que j'ai pour l'instant pour voir ce qui cloche:


Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'si le fichier listelocale.txt existe, on le supprime
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
        End If
        'si le fichier liste.txt existe, on le supprime
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\liste.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\liste.txt")
        End If
        'création d'une liste de tous les fichiers présents dans un dossier et ses sous dossiers
        'remplacer Application.StartupPath par le dossier racine voulu
        Dim repertoire() As IO.FileInfo = New IO.DirectoryInfo(Application.StartupPath).GetFiles("*", IO.SearchOption.AllDirectories)
        'écriture de la liste locale des fichiers 
        Using writer As New IO.StreamWriter(Application.StartupPath & "\listelocale.txt", False, System.Text.Encoding.Default)
            For Each fichier As IO.FileInfo In repertoire
                'avec leur nom et leur MD5 séparé par un espace 
                'Note: le choix de l'espace pour la séparation n'est peut-être pas judicieux
                'utiliser New Char() {Convert.ToChar(1)}  pour un meilleur séparateur
                'utilise fichier.FullName pour écrire le chemin complet du fichier
                Dim fichier_p As String = fichier.FullName.Replace(Application.StartupPath, "").Substring(1)
                writer.WriteLine(fichier_p & " " & MD5File(fichier.FullName))
            Next
        End Using
        'téléchargement du fichier liste.txt distant pour la comparaison
        My.Computer.Network.DownloadFile("http://www.monsite.fr/updater/liste.txt", Application.StartupPath & "\liste.txt")

        'ici tu n'a plus qu'à comparer les 2 fichiers (liste.txt et listelocale.txt)
        'utilise My.Computer.Network.DownloadFile pour mettre à jour les fichiers qui manquent ou à remplacer

        Using reader_loc As New IO.StreamReader(Application.StartupPath & "\listelocale.txt")
            Do While Not reader_loc.EndOfStream
                Dim l As String = reader_loc.ReadLine
                Dim l2 As String = ""
                Using reader_dist As New IO.StreamReader(Application.StartupPath & "\liste.txt")
                    Dim fichierexiste As Boolean = False
                    Do While Not reader_dist.EndOfStream
                        l2 = reader_dist.ReadLine
                        'fichiers de même nom
                        If l.Split(" "c)(0) = l2.Split(" "c)(0) Then
                            'le hash est différent
                            If l.Split(" "c)(1) <> l2.Split(" "c)(1) Then
                                My.Computer.Network.DownloadFile(l2.Split(" "c)(0), Application.StartupPath & "" & l2.Split(" "c)(0))

                            Else
                                'le hash est le même (on peut effectuer une action ici)
                            End If
                            fichierexiste = True
                        End If
                    Loop
                    If Not fichierexiste Then
                        My.Computer.Network.DownloadFile(l2.Split(" "c)(0), Application.StartupPath & "" & l2.Split(" "c)(0))

                    End If
                End Using
            Loop
        End Using
        'si le fichier listelocale.txt existe, on le supprime
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
        End If
        'si le fichier liste.txt existe, on le supprime
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\liste.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\liste.txt")
        End If

    End Sub
    'fonction de hashage MD5
    Private Function MD5File(ByVal nFichier As String) As String
        Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim fmd5 As New IO.FileStream(nFichier, IO.FileMode.Open, IO.FileAccess.Read)
        md5.ComputeHash(fmd5)
        Dim hash As Byte() = md5.Hash
        Dim buff As System.Text.StringBuilder = New System.Text.StringBuilder
        Dim hashByte As Byte
        For Each hashByte In hash
            buff.Append(String.Format("{0:X2}", hashByte))
        Next
        md5.Clear()
        fmd5.Close()
        fmd5.Dispose()
        Return buff.ToString
    End Function
End Class
0
Utilisateur anonyme
17 août 2011 à 16:03
Bon voilà, j'ai modifié mon code pour qu'il soit plus clair au niveau des variables.
N'hésite pas à mettre des points d'arrêt (F9) sur les lignes où tu souhaites vérifier les valeurs de tes variables.
Il va sûrement aussi que tu prévoie la création de dossier par code, en te servant de My.computer.filesystem.createdirectory.

Je pense qu'avec tout ceci, tu vas pouvoir t'en sortir.

Bonne prog.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'si le fichier liste local existe, on le supprime
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
        End If

        'téléchargement du fichier liste.txt distant pour la comparaison
        My.Computer.Network.DownloadFile("http://monsite.fr/liste.txt", Application.StartupPath & "\liste.txt", "", "", False, 100, True)

        'création du fichier local
        Dim repertoire() As IO.FileInfo = New IO.DirectoryInfo(Application.StartupPath).GetFiles("*", IO.SearchOption.AllDirectories)
        'écriture de la liste locale des fichiers 
        Using writer As New IO.StreamWriter(Application.StartupPath & "\listelocale.txt", False, System.Text.Encoding.Default)
            For Each fichier As IO.FileInfo In repertoire
                'avec leur nom et leur MD5 séparé par un espace 
                'Note: le choix de l'espace pour la séparation n'est peut-être pas judicieux
                'utiliser New Char() {Convert.ToChar(1)}  pour un meilleur séparateur
                'utilise fichier.FullName pour écrire le chemin complet du fichier
                Dim fichier_p As String = fichier.FullName.Replace(Application.StartupPath, "").Substring(1)
                writer.WriteLine(fichier_p & " " & MD5File(fichier.FullName))
            Next
        End Using
        'comparaison...
        Using reader_dist As New IO.StreamReader(Application.StartupPath & "\liste.txt")
            Do While Not reader_dist.EndOfStream
                'lecture de la ligne du fichier
                Dim ligne_dist As String = reader_dist.ReadLine
                'séparation des informations
                Dim fichier_dist As String = ligne_dist.Split(" "c)(0)
                Dim md5_dist As String = ligne_dist.Split(" "c)(1)
                Dim fichier_loc As String = ""
                Using reader_loc As New IO.StreamReader(Application.StartupPath & "\listelocale.txt")
                    Dim fichierexiste As Boolean = False
                    Do While Not reader_loc.EndOfStream
                        Dim ligne_loc As String = reader_loc.ReadLine
                        fichier_loc = ligne_loc.Split(" "c)(0)
                        Dim md5_loc As String = ligne_loc.Split(" "c)(1)
                        'fichiers de même nom
                        If fichier_dist = fichier_loc Then
                            'le md5 est différent
                            If md5_dist <> md5_loc Then
                                Debug.Print("md5 différent : téléchargement de " & fichier_dist)
                                My.Computer.Network.DownloadFile("http://monsite.fr/" & fichier_dist, Application.StartupPath & "" & fichier_dist, "", "", False, 100, True)
                            Else
                                'le hash est le même (on peut effectuer une action ici)
                                Debug.Print("fichier existe (md5 égal) " & fichier_dist)
                            End If
                            fichierexiste = True
                            Exit Do
                        End If
                    Loop
                    'si le fichier n'existe pas on le télécharge
                    If Not fichierexiste Then
                        Debug.Print("fichier introuvable : telechargement de " & fichier_dist)
                        My.Computer.Network.DownloadFile("http://monsite.fr/" & fichier_dist, Application.StartupPath & "" & fichier_dist, "", "", False, 100, True)
                    End If
                End Using
            Loop
        End Using
    End Sub
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
17 août 2011 à 16:47
En effet c'est plus clair mais un problème survient maintenant dès le téléchargement du fichier liste.txt. Je le vois chargé à côté de l'application mais vide (cela me le faisait avant j'attendais un peu et je voyais le fichier se charger vraiment après (avec les lignes). Et après je vois une erreur Microsoft.NET Framework : The operation has timed out
Le fichier listelocale.txt n'est donc pas créé et le processus s'arrête.
J'utilise le code que tu viens de me fournir en ayant modifié les adresses bien sûr, et j'aurai une question, est-ce que pour la partie:
My.Computer.Network.DownloadFile("http://monsite.fr/" & fichier_dist, Application.StartupPath & "" & fichier_dist, "", "", False, 100, True)
Je peux changer l'adresse en par exemple: http://monsite.fr/updater/pack/
Sachant que j'ai mon fichier liste.txt dans le dossier updater et que je regrouperai les fichiers à télécharger dans le dossier pack ?
0
Utilisateur anonyme
17 août 2011 à 16:55
The operation has timed out

Essaie de mettre un timeout plus important. (DownloadFile)
Sinon tu peux garder ta méthode qui marchait pour le téléchargement.
Je peux changer l'adresse en par exemple: http://monsite.fr/updater/pack/

Oui bien sûr.

Bonne prog.
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
17 août 2011 à 19:37
Ok merci, je suis revenu à l'ancien pour le téléchargement du liste.txt et cela marche. Néanmoins maintenant j'ai remarqué que lorsque je met un fichier gros sur le liste.txt (pour qu'il soit téléchargé) j'ai une erreur timeout (The operation has timed out). Est-il possible de désactiver le timeout, j'ai cru voir qu'il est réglé à 100 par défaut:
My.Computer.Network.DownloadFile("http://www.monsite.fr/updater/pack/" & fichier_dist, Application.StartupPath & "" & fichier_dist, "", "", False, 100, True)

Je ne sais pas si augmenter la valeur (100) suffirait pour des fichiers de 120 mo par exemple.

Et surtout j'aimerais savoir pourquoi l'interface de l'application ne se lance qu'une fois que la partie mise à jour est terminée ? J'aimerais que l'interface se lance dès le début et faire apparaître dans des textbox par exemple: contrôle des fichiers..., téléchargement de ... et mettre une barre de chargement pour les téléchargements.

Enfin savez vous si il est possible de mettre à jour l'application elle-même (en la rajoutant dans liste.txt) ?
0
Utilisateur anonyme
17 août 2011 à 21:58
Je viens de me souvenir que j'avais une classe sous forme de picturebox pour le téléchargement de fichiers.
Tu peux ajouter une nouvelle classe à ton projet et coller ceci :
Option Strict On
Imports System.IO
Imports System.Net
Imports System.Threading

Public Class pctDownload
    Inherits PictureBox
    Dim b As Bitmap
    Dim g As Graphics
    Dim ft As New Font("Arial", 12, FontStyle.Regular, GraphicsUnit.Pixel)
    Dim f As IO.FileStream
    Dim m_Fichier, m_Destination As String
    Event Complet(ByVal Fichier As String)
    Delegate Sub Progress(ByVal Cours As Integer, ByVal Total As Integer)

    Public Sub New(ByVal Fichier As String, ByVal Destination As String, ByVal Largeur As Integer, ByVal Hauteur As Integer)
        With Me
            .Width = Largeur
            .Height = Hauteur
            .BorderStyle = Windows.Forms.BorderStyle.FixedSingle
        End With
        b = New Bitmap(Largeur, Hauteur)
        g = Graphics.FromImage(b)
        m_Fichier = Fichier
        m_Destination = Destination
        g.FillRectangle(Brushes.LightSteelBlue, b.GetBounds(GraphicsUnit.Pixel))
        g.DrawString("0.00 %", ft, Brushes.White, Convert.ToInt32(Largeur / 2) - 15, 2)
        Me.Image = CType(b.Clone, Image)
    End Sub

    Public Sub Start()
        Dim t As New Thread(AddressOf Telecharge)
        t.Start()
    End Sub

    Private Sub Telecharge()
        Dim fic As String = m_Fichier.Substring(m_Fichier.LastIndexOf("/") + 1)
        Dim webr As WebRequest = HttpWebRequest.Create(m_Fichier)
        Dim webrequest As HttpWebRequest = DirectCast(webr, HttpWebRequest)
        Dim Length As Integer
        Dim rcvStream As Stream

        webrequest.Method = "GET"
        webrequest.Pipelined = False
        webrequest.KeepAlive = False
        webrequest.Credentials = New System.Net.CredentialCache
        webrequest.AuthenticationLevel = Security.AuthenticationLevel.MutualAuthRequested
        webrequest.Timeout = 9000
        webrequest.ProtocolVersion = New Version(1, 1)
        webrequest.ContentType = "*/*"
        webrequest.AllowAutoRedirect = True
        webrequest.MaximumAutomaticRedirections = 10

        Dim webrep As WebResponse = webrequest.GetResponse
        Dim webreponse As HttpWebResponse = DirectCast(webrep, HttpWebResponse)

        Length = Convert.ToInt32(webreponse.ContentLength)
        rcvStream = webreponse.GetResponseStream
        Dim buf(1024) As Byte
        Dim bytesread As Integer
        Dim fw As BinaryWriter = Nothing
        Try
            f = New FileStream(m_Destination & fic, FileMode.CreateNew)
            fw = New BinaryWriter(f)
        Catch
            Do
                Dim rd As New Random
                fic = rd.Next(0, 2000000).ToString & "_" & fic
                If My.Computer.FileSystem.FileExists(m_Destination & fic) = False Then Exit Do
            Loop
            f = New FileStream(m_Destination & fic, FileMode.OpenOrCreate)
            fw = New BinaryWriter(f)
        End Try
        Do
            bytesread = rcvStream.Read(buf, 0, buf.Length)
            fw.Write(buf, 0, bytesread)
            If Me.InvokeRequired Then Me.Invoke(New Progress(AddressOf Progression), Convert.ToInt32(f.Length), Length)
        Loop Until bytesread = 0

        fw.Close()
        f.Close()
    End Sub

    Private Sub Progression(ByVal Cours As Integer, ByVal Total As Integer)
        g.FillRectangle(Brushes.LightSteelBlue, b.GetBounds(GraphicsUnit.Pixel))
        Dim c As New Rectangle(0, 0, Convert.ToInt32((Cours / Total) * b.Width), b.Height)
        g.FillRectangle(Brushes.SteelBlue, c)
        Dim lft As SizeF = g.MeasureString(String.Format("{0:0.00%}", Cours / Total), ft, SizeF.Empty, StringFormat.GenericDefault)
        g.DrawString(String.Format("{0:0.00%}", Cours / Total), ft, Brushes.White, Convert.ToInt32((b.Width / 2) - (lft.Width / 2)), 2)
        Me.Image = CType(b.Clone, Image)
        If Cours = Total Then
            RaiseEvent Complet(m_Fichier)
        End If
    End Sub
End Class


Et pour l'utiliser on fait comme ceci :

Public Class Form1
    'déclaration du picturebox avec son événement
    Dim WithEvents ProgressB As pctDownload

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'instanciation de la classe
        ProgressB = New pctDownload("http://monsite.fr/dossier/grosfichier.txt", Application.StartupPath & "", 200, 22)
        'ajout de la picturebox au formulaire
        Me.Controls.Add(ProgressB)
        'démarrage du téléchargement
        ProgressB.Start()
    End Sub

    Private Sub ProgressB_Complet(ByVal Fichier As String) Handles ProgressB.Complet
        MessageBox.Show(Fichier & " à été reçu avec succès")
        'ici tu peux lancer un autre téléchargement ...
    End Sub
End Class


En espérant que ceci puisse te servir pour le téléchargement de tes fichiers.

Bonne prog.
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
17 août 2011 à 22:29
En fait je ne suis pas sûr d'avoir compris mais ça a l'air de fonctionner pour le téléchargement d'un gros fichier alors que moi je veux inclure ça pour le téléchargement de tous mes fichiers. Et par exemple dans le début du code mettre dans une message box "création de la liste des fichiers", puis "vérification de l'intégrité des fichiers" puis"téléchargement de fichier.txt(ou fichier2.rar, ect)" avec la progression du téléchargement du fichier dans une progressbar et enfin mettre "mise à jour terminée". Enfin ce sont des exemples. Je ne sais pas si c'est possible à mettre en place. Si je veux faire deux progressbar (une pour l'avancement du téléchargement du fichier, et une pour l'avancement du téléchargement général) j'aurais besoin de créer un fichier qui recense tous les fichiers à télécharger au lieu de faire sous forme de boucle ?

Et surtout j'aimerais savoir pourquoi l'interface de l'application ne se lance qu'une fois que la partie mise à jour est terminée ? J'aimerais que l'interface se lance dès le début et faire apparaître dans des textbox par exemple: contrôle des fichiers..., téléchargement de ... et mettre une barre de chargement pour les téléchargements.

Enfin savez vous si il est possible de mettre à jour l'application elle-même (en la rajoutant dans liste.txt) ?

Connaissez-vous les réponses à ces questions ?
0
Utilisateur anonyme
17 août 2011 à 22:45
La méthode DownloadFile est bloquante ce qui signifie que les lignes de code suivantes ne sont pas exécutées tant que le (ou les) fichier n'est pas arrivé.
L'exemple que je t'ai donné juste avant te permet de télécharger des fichiers sans bloquer ton application et affiche en même temps une barre de progression du téléchargement.
De plus l'événement ProgressB_Complet te permet de modifier par exemple un label d'information (nom du fichier en cours de téléchargement, etc..)
Il permet ensuite de lancer le téléchargement suivant.
En ce qui concerne l'avancement total du téléchargement, tu dois pour cela connaître à l'avance la taille totale de tous les fichiers à télécharger.
Pour cela, tu devra ajouter dans ton fichier liste distant la taille du fichier en plus du nom et du md5.
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013
18 août 2011 à 00:08
Je suis un peu perdu avec ton nouveau code, est-ce que quelque chose de ce genre là pourrait marcher ?

Option Strict On
Imports System.IO
Imports System.Net
Imports System.Threading

Public Class pctDownload
    Inherits PictureBox
    Dim b As Bitmap
    Dim g As Graphics
    Dim ft As New Font("Arial", 12, FontStyle.Regular, GraphicsUnit.Pixel)
    Dim f As IO.FileStream
    Dim m_Fichier, m_Destination As String
    Event Complet(ByVal Fichier As String)
    Delegate Sub Progress(ByVal Cours As Integer, ByVal Total As Integer)

    Public Sub New(ByVal Fichier As String, ByVal Destination As String, ByVal Largeur As Integer, ByVal Hauteur As Integer)
        With Me
            .Width = Largeur
            .Height = Hauteur
            .BorderStyle = Windows.Forms.BorderStyle.FixedSingle
        End With
        b = New Bitmap(Largeur, Hauteur)
        g = Graphics.FromImage(b)
        m_Fichier = Fichier
        m_Destination = Destination
        g.FillRectangle(Brushes.LightSteelBlue, b.GetBounds(GraphicsUnit.Pixel))
        g.DrawString("0.00 %", ft, Brushes.White, Convert.ToInt32(Largeur / 2) - 15, 2)
        Me.Image = CType(b.Clone, Image)
    End Sub

    Public Sub Start()
        Dim t As New Thread(AddressOf Telecharge)
        t.Start()
    End Sub

    Private Sub Telecharge()
        Dim fic As String = m_Fichier.Substring(m_Fichier.LastIndexOf("/") + 1)
        Dim webr As WebRequest = HttpWebRequest.Create(m_Fichier)
        Dim webrequest As HttpWebRequest = DirectCast(webr, HttpWebRequest)
        Dim Length As Integer
        Dim rcvStream As Stream

        webrequest.Method = "GET"
        webrequest.Pipelined = False
        webrequest.KeepAlive = False
        webrequest.Credentials = New System.Net.CredentialCache
        webrequest.AuthenticationLevel = Security.AuthenticationLevel.MutualAuthRequested
        webrequest.Timeout = 9000
        webrequest.ProtocolVersion = New Version(1, 1)
        webrequest.ContentType = "*/*"
        webrequest.AllowAutoRedirect = True
        webrequest.MaximumAutomaticRedirections = 10

        Dim webrep As WebResponse = webrequest.GetResponse
        Dim webreponse As HttpWebResponse = DirectCast(webrep, HttpWebResponse)

        Length = Convert.ToInt32(webreponse.ContentLength)
        rcvStream = webreponse.GetResponseStream
        Dim buf(1024) As Byte
        Dim bytesread As Integer
        Dim fw As BinaryWriter = Nothing
        Try
            f = New FileStream(m_Destination & fic, FileMode.CreateNew)
            fw = New BinaryWriter(f)
        Catch
            Do
                Dim rd As New Random
                fic = rd.Next(0, 2000000).ToString & "_" & fic
                If My.Computer.FileSystem.FileExists(m_Destination & fic) = False Then Exit Do
            Loop
            f = New FileStream(m_Destination & fic, FileMode.OpenOrCreate)
            fw = New BinaryWriter(f)
        End Try
        Do
            bytesread = rcvStream.Read(buf, 0, buf.Length)
            fw.Write(buf, 0, bytesread)
            If Me.InvokeRequired Then Me.Invoke(New Progress(AddressOf Progression), Convert.ToInt32(f.Length), Length)
        Loop Until bytesread = 0

        fw.Close()
        f.Close()
    End Sub

    Private Sub Progression(ByVal Cours As Integer, ByVal Total As Integer)
        g.FillRectangle(Brushes.LightSteelBlue, b.GetBounds(GraphicsUnit.Pixel))
        Dim c As New Rectangle(0, 0, Convert.ToInt32((Cours / Total) * b.Width), b.Height)
        g.FillRectangle(Brushes.SteelBlue, c)
        Dim lft As SizeF = g.MeasureString(String.Format("{0:0.00%}", Cours / Total), ft, SizeF.Empty, StringFormat.GenericDefault)
        g.DrawString(String.Format("{0:0.00%}", Cours / Total), ft, Brushes.White, Convert.ToInt32((b.Width / 2) - (lft.Width / 2)), 2)
        Me.Image = CType(b.Clone, Image)
        If Cours = Total Then
            RaiseEvent Complet(m_Fichier)
        End If
    End Sub
End Class

Public Class Form1
    'déclaration du picturebox avec son événement
    Dim WithEvents ProgressB As pctDownload
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'si les fichiers listelocale.txt et liste.txt existent, on les suppriment
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
        End If
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\liste.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\liste.txt")
        End If

        'instanciation de la classe
        ProgressB = New pctDownload("http://monsite.fr/updater/liste.txt", Application.StartupPath & "\liste.txt", 200, 22)

        'ajout de la picturebox au formulaire
        Me.Controls.Add(ProgressB)
        'démarrage du téléchargement
        ProgressB.Start()
    End Sub

    Private Sub ProgressB_Complet(ByVal Fichier As String) Handles ProgressB.Complet
        MessageBox.Show(Fichier & " Vérification des fichiers")
        'ici tu peux lancer un autre téléchargement ...

        'création du fichier local
        Dim repertoire() As IO.FileInfo = New IO.DirectoryInfo(Application.StartupPath).GetFiles("*", IO.SearchOption.AllDirectories)
        'écriture de la liste locale des fichiers 
        Using writer As New IO.StreamWriter(Application.StartupPath & "\listelocale.txt", False, System.Text.Encoding.Default)
            For Each fichier As IO.FileInfo In repertoire
                'avec leur nom et leur MD5 séparé par un espace 
                'Note: le choix de l'espace pour la séparation n'est peut-être pas judicieux
                'utiliser New Char() {Convert.ToChar(1)}  pour un meilleur séparateur
                'utilise fichier.FullName pour écrire le chemin complet du fichier
                Dim fichier_p As String = fichier.FullName.Replace(Application.StartupPath, "").Substring(1)
                writer.WriteLine(fichier_p & " " & MD5File(fichier.FullName))
            Next
        End Using
        'comparaison...
        Using reader_dist As New IO.StreamReader(Application.StartupPath & "\liste.txt")
            Do While Not reader_dist.EndOfStream
                'lecture de la ligne du fichier
                Dim ligne_dist As String = reader_dist.ReadLine
                'séparation des informations
                Dim fichier_dist As String = ligne_dist.Split(" "c)(0)
                Dim md5_dist As String = ligne_dist.Split(" "c)(1)
                Dim fichier_loc As String = ""
                Using reader_loc As New IO.StreamReader(Application.StartupPath & "\listelocale.txt")
                    Dim fichierexiste As Boolean = False
                    Do While Not reader_loc.EndOfStream
                        Dim ligne_loc As String = reader_loc.ReadLine
                        fichier_loc = ligne_loc.Split(" "c)(0)
                        Dim md5_loc As String = ligne_loc.Split(" "c)(1)
                        'fichiers de même nom
                        If fichier_dist = fichier_loc Then
                            'le md5 est différent
                            If md5_dist <> md5_loc Then
                                Debug.Print("md5 différent : téléchargement de " & fichier_dist)
                                'instanciation de la classe
                                ProgressB = New pctDownload("http://monsite.fr/updater/pack/" & fichier_dist, Application.StartupPath & "" & fichier_dist, 200, 22)

                                'ajout de la picturebox au formulaire
                                Me.Controls.Add(ProgressB)
                                'démarrage du téléchargement
                                ProgressB.Start()
                            Else
                                'le hash est le même (on peut effectuer une action ici)
                                Debug.Print("fichier existe (md5 égal) " & fichier_dist)
                            End If
                            fichierexiste = True
                            Exit Do
                        End If
                    Loop
                    'si le fichier n'existe pas on le télécharge
                    If Not fichierexiste Then
                        Debug.Print("fichier introuvable : telechargement de " & fichier_dist)
                        'instanciation de la classe
                        ProgressB = New pctDownload("http://monsite.fr/updater/pack/" & fichier_dist, Application.StartupPath & "" & fichier_dist, 200, 22)

                        'ajout de la picturebox au formulaire
                        Me.Controls.Add(ProgressB)
                        'démarrage du téléchargement
                        ProgressB.Start()
                    End If
                End Using
            Loop
        End Using
        'si les fichiers listelocale.txt et liste.txt existent, on les suppriment
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\listelocale.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\listelocale.txt")
        End If
        If My.Computer.FileSystem.FileExists(Application.StartupPath & "\liste.txt") Then
            My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\liste.txt")
        End If
    End Sub
    'fonction de hashage MD5
    Private Function MD5File(ByVal nFichier As String) As String
        Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim fmd5 As New IO.FileStream(nFichier, IO.FileMode.Open, IO.FileAccess.Read)
        md5.ComputeHash(fmd5)
        Dim hash As Byte() = md5.Hash
        Dim buff As System.Text.StringBuilder = New System.Text.StringBuilder
        Dim hashByte As Byte
        For Each hashByte In hash
            buff.Append(String.Format("{0:X2}", hashByte))
        Next
        md5.Clear()
        fmd5.Close()
        fmd5.Dispose()
        Return buff.ToString
    End Function
End Class


Pour l'instant je ne peux pas tester parce que j'ai une erreur à la ligne en rouge (Variable 'fichier' hides a variable in an enclosing block)
J'avance un peu au hasard là parce que je ne vois pas trop comment inclure les deux codes ensemble pour garder la structure tout en enlevant les downloadfile.
0
Rejoignez-nous