Progress bar et avancement pour plusieurs dowloads

Résolu
cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011 - 24 août 2011 à 19:42
 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

12 réponses

cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011
25 août 2011 à 20:43
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
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 août 2011 à 20:23
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
---
0
cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011
24 août 2011 à 20:35
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.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 août 2011 à 20:43
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
---
0

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

Posez votre question
cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011
24 août 2011 à 21:53
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 août 2011 à 20:26
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
---
0
cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011
25 août 2011 à 23:55
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é.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
26 août 2011 à 00:00
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
---
0
cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011
26 août 2011 à 13:43
Si à l'avenir je code d'autres application utilisant le "multi downloading" la ça vaudra le coup effectivement de faire un controle personnalisé.
0
cs_oxygene2 Messages postés 15 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 26 août 2011
26 août 2011 à 20:41
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.
0
Utilisateur anonyme
26 août 2011 à 20:47
Bonsoir,
Tu peux très bien instancier une classe contenant un WebClient pour chaque fichier à télécharger.
Bonne soirée.
0
Utilisateur anonyme
27 août 2011 à 10:34
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
0
Rejoignez-nous