Progress bar et avancement pour plusieurs dowloads [Résolu]

cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 24 août 2011 à 19:42 - Dernière réponse :  Utilisateur anonyme
- 27 août 2011 à 10:34
Salut à tous !

Avant tout chose je vais essayer d'expliquer clairement ce que je compte faire
Système de maj à double emploi : mettre à jour et empêcher de lancer l'application avec des fichiers modifiés (car téléchargés si différents).
Voici comment je comptais m'y prendre :

1 téléchargement d'un fichier de config (xml)
2 lecture du xml et stockage des valeurs
3 Comparaison de ces valeurs avec les fichiers présents dans le dossier de l'appli (via des filelen etc...)
4 Si données différentes alors téléchargements des fichiers avec avancement du dl
5 Suite de l'appli

Je bloque à l'étape 4.
Pour ce qui est de télécharger un seul fichier et afficher son avancement (progress bar , %, kb téléchargé/total) mon code marche nickel.
par contre quand il faut téléchargé plusieurs fichiers le téléchargement fonctionne mais pas l'affichage de l'avancement.

Voici mon script actuel :
Imports System.Net

Public Class MAJ
    Public fichier
    Public URL
    Private WithEvents dlfichier As New Net.WebClient()
    Private Sub MAJ_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ProgressBar1.Value = 0
        Etat.Text = "Vérification en cours..."
        telecharger("http://www.../Clients.xml", ".\Clients.xml")
'appel de la sub lire pour stocker les valeurs de tailles des fichiers (tBGM étant la valeur du xml téléchargé et tBGM2 la valeur obtenu via filelen du fichier de l'ordi)
        lire()
                If tBGM = tBGM2 Then
                    dlfichier = New Net.WebClient
                    fichier = ".\BGM.epk"
                    URL = "http://www..."
                    dlfichier.DownloadFileAsync(New Uri(URL), fichier)
                    Etat.Text = "Téléchargement BGM en cours..."
                End If
                If tEffect = tEffect2 Then
                    dlfichier = New Net.WebClient
                    fichier = ".\Effect.epk"
                    URL = "http://www..."
                    dlfichier.DownloadFileAsync(New Uri(URL), fichier)
                    Etat.Text = "Téléchargement Effect en cours..."
                End If
 '..... Que 2 ici mais il y a 21 fichiers en tout à comparer 
    End Sub

'gestion de la progress bar
    Public Sub dlfichier_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles dlfichier.DownloadProgressChanged
        Try
            Dim dDownloadProgress As Decimal = CStr(e.BytesReceived / e.TotalBytesToReceive * 100)
            ProgressBar1.Value = CInt(dDownloadProgress)

            ' Afficher le statut
            Dim dDownloadedMB As Decimal = Format((e.BytesReceived / 1024) / 1024, "###,###,##0.00")
            Dim dTotalToDownloadMB As Decimal = Format((e.TotalBytesToReceive / 1024) / 1024, "###,###,##0.00")
            Me.Text = "Téléchargement: " & dDownloadedMB & "MB sur " & dTotalToDownloadMB & "MB - Etat: " _
            & Format(dDownloadProgress, "###.00") & "%"
        Catch ex As Exception
        End Try
    End Sub

'gestion de l'avancement
    Private Sub dlfichier_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles dlfichier.DownloadFileCompleted
        If ProgressBar1.Value = ProgressBar1.Maximum Then
            Etat.Text = "Téléchargement terminé"
        Else
            IO.File.Delete(fichier) ' Suprime le fichier si anulation
        End If
    End Sub
End Class


Actuellement si les 2 fichiers sont à mettre à jour l'avancement ne prend en compte que le 2eme.
Dans l'idéal j'aimerai que l'avancement prennent en compte le total des fichiers a télécharger ou alors que l'avancement se remette à 0 pour chaque fichier téléchargé.

J'ai essayé plusieurs choses mais je sèche.
Merci pour vos réponses
Afficher la suite 

Votre réponse

12 réponses

cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 25 août 2011 à 20:43
+3
Utile
Bon j'obtient ce code fonctionnel pour plusieurs fichier :

Imports System.Net

Public Class MAJ
    Public fichier
    Public URL
    Private WithEvents dlfichier As New Net.WebClient()
    Private WithEvents dlfichier2 As New Net.WebClient()
    Private current1 As Long
    Private current2 As Long
    Private total1 As Long
    Private total2 As Long
    Private pourcentagedl As Decimal
    Private pourcentagedl2 As Decimal
    Public pBGM
    Public pEffect
    Public totalp

    Private Sub MAJ_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Kill(".\Clients.xml")
        ProgressBar1.Value = 0
        Etat.Text = "Vérification en cours..."
        telecharger("http://www...Clients.xml", ".\Clients.xml")
        lire()
        If tBGM = tBGM2 Then
            fichier = ".\BGM.epk"
            URL = "http://www.../BGM.epk"
            dlfichier.DownloadFileAsync(New Uri(URL), fichier)
            Etat.Text = "Téléchargement en cours..."
            pBGM = 1
        End If
        If tEffect = tEffect2 Then
            fichier = ".\Effect.epk"
            URL = "http://www.../Effect.epk"
            dlfichier2.DownloadFileAsync(New Uri(URL), fichier)
            Etat.Text = "Téléchargement en cours..."
            pEffect = 1
        End If
        totalp = pBGM + pEffect

        'mettre control box en false pour enlever la croix (empecher la fermeture)
    End Sub
    Private Sub dlfichier_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles dlfichier.DownloadProgressChanged
        Me.current1 = Format((e.BytesReceived / 1024) / 1024, "###,###,##0.00")
        Me.total1 = Format((e.TotalBytesToReceive / 1024) / 1024, "###,###,##0.00")
        Me.pourcentagedl = CStr(e.BytesReceived / e.TotalBytesToReceive * 100)
        Me.UpdateProgress()
    End Sub
    Private Sub dlfichier2_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles dlfichier2.DownloadProgressChanged
        Me.current2 = Format((e.BytesReceived / 1024) / 1024, "###,###,##0.00")
        Me.total2 = Format((e.TotalBytesToReceive / 1024) / 1024, "###,###,##0.00")
        Me.pourcentagedl2 = CStr(e.BytesReceived / e.TotalBytesToReceive * 100)
        Me.UpdateProgress()
    End Sub
    Private Sub UpdateProgress()
        If Me.total1 <> 0L AndAlso Me.total2 <> 0L Then
            Me.ProgressBar1.Value = CInt(Math.Round(100 * (Me.current1 + Me.current2) / (Me.total1 + Me.total2)))
            Me.Text = "Téléchargement: " & Me.current1 + Me.current2 & "MB sur " & Me.total1 + Me.total2 & "MB - Etat: " _
            & Format((Me.pourcentagedl + Me.pourcentagedl2) / totalp, "###.00") & "%"
        Else
            Me.ProgressBar1.Value = 0
        End If
        If ProgressBar1.Value = ProgressBar1.Maximum Then
            Etat.Text = "Téléchargement terminé"
            Me.Close()
        End If
    End Sub


Cependant j'ai désormais le problème inverse.
Rien ne se passe pour un seul fichier
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_oxygene2
NHenry 14178 Messages postés vendredi 14 mars 2003Date d'inscription 21 mai 2018 Dernière intervention - 24 août 2011 à 20:23
0
Utile
Bonjour,

Pour comparer, tu peux utiliser un Hash MD5, comme ça tu télécharges uniquement les fichiers donc le MD5 est différent.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 24 août 2011 à 20:35
0
Utile
La partie comparaison est opérationnelle.
C'est uniquement la partie progress bar et avancement qui me pose problème.


Tous les exemples que je trouve ne concernent que l'avancement pour le téléchargement d'un fichier.
Commenter la réponse de cs_oxygene2
NHenry 14178 Messages postés vendredi 14 mars 2003Date d'inscription 21 mai 2018 Dernière intervention - 24 août 2011 à 20:43
0
Utile
Bonjour,

J'ai trouvé 3 liens en top dans Google, sans forcer, tu as testé quoi ?
"vb.net téléchargement progressbar"

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 24 août 2011 à 21:53
Commenter la réponse de cs_oxygene2
NHenry 14178 Messages postés vendredi 14 mars 2003Date d'inscription 21 mai 2018 Dernière intervention - 25 août 2011 à 20:26
0
Utile
Bonjour,

En regardant le lien :
http://www.siteduzero.com/forum-83-556409-p1-vb-net-progressbar-telechargement.html

Je vois juste un objet déclaré et une gestion d'événement, il y a pas de difficultés particulières pour faire du Multi download, il faut autant d'objet que nécessaire et un repérage de l'objet envoyant l'événement pour mettre à jour la bonne ProgressBar.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 25 août 2011 à 23:55
0
Utile
J'ai corrigé.

J'avais oublié d'enlever la condition
If Me.total1 <> 0L AndAlso Me.total2 <> 0L Then ...


Tout à l'air de bien fonctionner maintenant.

Je te remercie tout de même pour le temps que tu as passé.
Commenter la réponse de cs_oxygene2
NHenry 14178 Messages postés vendredi 14 mars 2003Date d'inscription 21 mai 2018 Dernière intervention - 26 août 2011 à 00:00
0
Utile
Bonjour,

Tu peux aussi faire des controles personalisés utilisant une PB, puis avec 2 propriétés et 2 méthodes (URL, Local, Start, Stop), Comme ça, tu peux avoir autant de téléchargement que tu veux sans changer ton code énormément.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 26 août 2011 à 13:43
0
Utile
Si à l'avenir je code d'autres application utilisant le "multi downloading" la ça vaudra le coup effectivement de faire un controle personnalisé.
Commenter la réponse de cs_oxygene2
cs_oxygene2 15 Messages postés jeudi 30 septembre 2010Date d'inscription 26 août 2011 Dernière intervention - 26 août 2011 à 20:41
0
Utile
Alors je reviens ici car après plusieurs essai cette solution si elle marche est assez bancale...

En effet pour plusieurs gros fichier à téléchargé en même temps il y a un bug d'affichage :
Pour l'exemple on a 11MB au début (valeur du 1er fichier chargé) puis arrivé a la moitié la progress bar se met à jour ,recule et on passe sur un base de 20MB (valeur exacte qu'on devrait avoir dès le début).


J'avais dans l'idée de ne créer qu'un seul web client et de faire une liste de téléchargement.
On prendrait fichier/fichier et le web client se réinitialiserai a chaque fois.
Pour l'affichage il suffirait de calculer la taille totale et de réinitialiser la progress bar à chaque fichier.

Au niveau du code par contre si je vois à peu près comment faire la liste je ne vois pas comment réinitialiser le web client.
Commenter la réponse de cs_oxygene2
Utilisateur anonyme - 26 août 2011 à 20:47
0
Utile
Bonsoir,
Tu peux très bien instancier une classe contenant un WebClient pour chaque fichier à télécharger.
Bonne soirée.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 27 août 2011 à 10:34
0
Utile
Un petit exemple pour illustrer :
Public Class Form1
    Dim WithEvents WC As System.Net.WebClient
    Dim Liste As New List(Of Uri)
    Dim lc As New Label
    Dim lt As New Label
    Dim _nb As Integer = -1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lt.BackColor = Color.Blue
        lt.BorderStyle = BorderStyle.FixedSingle
        lc.BackColor = Color.LightSteelBlue
        lc.BorderStyle = BorderStyle.FixedSingle
        lt.Width = 250

        Me.Controls.Add(lt)
        Me.Controls.Add(lc)
        lc.BringToFront()
        Liste.Add(New UriBuilder("http://www.test.com/fichier1.txt").Uri)
        Liste.Add(New UriBuilder("http://www.test.com/fichier2.txt").Uri)
        Liste.Add(New UriBuilder("http://www.test.com/fichier3.txt").Uri)
        WC_DownloadFileCompleted(Nothing, Nothing)
    End Sub

    Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WC.DownloadProgressChanged
        lc.Width = Convert.ToInt32((e.BytesReceived / e.TotalBytesToReceive) * lt.Width)
        lc.Text = e.ProgressPercentage.ToString & " %  - " & Liste.Item(_nb).OriginalString.Substring(Liste.Item(_nb).OriginalString.LastIndexOf("/") + 1)
        lt.Text = lc.Text
    End Sub

    Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WC.DownloadFileCompleted
        _nb += 1
        If _nb = Liste.Count Then Exit Sub
        'c'est ici qu'on instancie un nouveau webclient
        WC = New System.Net.WebClient
        WC.DownloadFileAsync(Liste.Item(_nb), Application.StartupPath & "" & Liste.Item(_nb).OriginalString.Substring(Liste.Item(_nb).OriginalString.LastIndexOf("/") + 1))
    End Sub

End Class
Commenter la réponse de Utilisateur anonyme

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.