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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionle fichier listelocale.txt qui est créé ne prend pas en compte le nom des dossiers
writer.WriteLine(fichier.FullName & " " & MD5File(fichier.FullName))
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 ces fichiers sont dans le dossier de ton application, retranche au nom de fichier : application.startuppath.
writer.WriteLine(fichier.FullName & " " & MD5File(fichier.FullName))
malgré des recherches que j'ai faite je n'ai pas vu faire ton conseil
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.
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
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
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.
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)
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
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
The operation has timed out
Je peux changer l'adresse en par exemple: http://monsite.fr/updater/pack/
My.Computer.Network.DownloadFile("http://www.monsite.fr/updater/pack/" & fichier_dist, Application.StartupPath & "" & fichier_dist, "", "", False, 100, True)
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 '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
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) ?
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