IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Gestion de téléchargement de fichiers


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut Gestion de téléchargement de fichiers
    Bonjour,

    Je crois que cette fois je vais poser un bon petit défi aux pros du VB avec mon problème

    Je vous explique : dans mon application je souhaite intégrer un outil de réparation de certains fichiers. Pour cela j'ai créé un Form avec des checkbox, permettant à l'utilisateur de choisir quel(s) fichier(s) il souhaite réparer. Pour la réparation, je télécharge le ou les fichier(s) concerné(s) depuis mon Dropbox, et je supprime les anciens pour les remplacer par les nouveaux, et hop ! le tour est joué.

    Cependant, là où je galère et je ne vois pas comment faire, c'est pour télécharger les fichiers. Je sais comment faire pour un fichier, mais impossible d'adapter pour plusieurs !

    Je m'explique bis : pour télécharger un fichier je passe par ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Try
                httpclient.DownloadFileAsync(New Uri(source), (destination))
            Catch ex As Exception
                Dim rep As MsgBoxResult
                rep = MsgBox("Téléchargement impossible." + vbCrLf & vbCrLf & ErrorToString() + vbCrLf + vbCrLf + "Veuillez réessayer ultérieurement ou contacter ClearMind Software.", vbOKOnly + vbCritical, "Erreur de téléchargement")
                If rep = vbOK Then
                  Process.Start("C:\ProgramData\Kumquat 2\restart.vbs")
                    End
                End If
            End Try
    avec la gestion de la progressbar et la gestion de fin de téléchargement dans des Sub séparés (bien à eux comme il faut). Cela fonctionne merveilleusement bien !

    Mais pour télécharger plus d'un fichier, c'est la misère ! Dans le Try, j'ai essayé de mettre des "If checkbox01.checked = true then", puis "If checkbox02.checked = true then" etc ... Mais avec plus d'un fichier, mon form disparaît tout bonnement, et le téléchargement se fait en arrière-plan mais que pour un seul fichier.

    Bref, j'ai essayé pleins de trucs, et rien à faire, je ne vois la marche à suivre. Donc si quelqu'un peut m'aider à y voir clair, ça m'aiderait vachement

    Après, peu m'importe si les fichiers doivent êtres téléchargés à la suite (l'un après l'autre), ou s'il peuvent être téléchargés en un seul "lot", cela ne me dérange aucunement, je trouverais comment m'en accommoder. Mais j'espère vraiment que quelqu'un aura une solution à me proposer car je nage total là ^^'

    Merci d'avance à ceux qui tenteront l'aventure !

    Bien cordialement,

    --
    Shennong

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Je ne vois pas très bien en quoi cela devrait donner du fil à retordre aux "Pros du VB" (comme tu dis) .....

    Il faut travailler avec une collection de String qui permet la gestion du premier arrivé, premier sorti ....et pour se faire il existe la classe Queue(Of ...).

    1- Donc dans un premier temps tu déclares :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private downloadUrls As New Queue(Of String)()
    2- Disons que tes urls sont stockées dans un List(Of String) nommé "urls"

    3- Tu ajoutes tes urls dans la file d'attente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      For Each u in urls
                downloadUrls.Enqueue(u)
      Next
    4- Tu créés une procédure qui sera lancés autant de fois (depuis DownloadF_DownloadFileCompleted) qu'il existe d'élément dans la collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Private Sub DownloadF(dirPath$)
            ' On vérifie que la liste n'est pas vide à chaque lancement de la routine
            If downloadUrls.Any() Then
              '......
              '............. on instancie ici un objet de la classe WebClient, on s'abonne aux 2 events et on télécharges le fichier retournée par la méthode Dequeue...
            End If
        End Sub
    5- Tu travailles avec la classe WebClient en t'abonnant dynamiquement aux gestionnaires d’événement permettant de connaitre la progression et la fin de tache asynchrone :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      Using wc As New WebClient
                    With wc
                        AddHandler .DownloadProgressChanged, AddressOf DownloadF_DownloadProgressChanged
                        AddHandler .DownloadFileCompleted, AddressOf DownloadF_DownloadFileCompleted
                        'L'url "s" est retournée et ensuite supprimée de la liste avec la méthode Dequeue
                        Dim s = downloadUrls.Dequeue()
                        ' On s'attarde ici à tout ce qui pourrait être utile en vue de constituer le chemin de destination du fichier téléchargé !
                        Dim fiName As New FileInfo(New Uri(s).AbsolutePath)
                        ' A noter que le 3ème argument est nécessaire pour relancer la méthode DownloadF s'il reste des fichiers en file d'attente dans l'event Completed !
                        .DownloadFileAsync(New Uri(s), dirPath & "\" & fiName.Name, dirPath)
                    End With
                End Using
                Return
    6- .....et enfin les 2 routines nécessaires au cycle de la file d'attente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Private Sub DownloadF_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)
            progressbar1.Value = e.ProgressPercentage
        End Sub
     
        Private Sub DownloadF_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
            If e.Error IsNot Nothing Then
                MsgBox(e.Error.ToString)
            End If
            DownloadF(e.UserState)
        End Sub
    7- Tu peux désormais lancer la procédure :
    ----> Un truc dans le genre.... nécessite certainement des ajustements..

    A l'impossible nul n'est tenu

    A+

  3. #3
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Pfiou ! O_o

    Merci beaucoup pour ton aide Wallace1. J'étais loin d'imaginer que ce serait aussi complexe pour simplement télécharger plusieurs fichiers. Y des endroits du code où la syntaxe m'est totalement inconnue. Je vais tâcher de comprendre ça le plus rapidement. Je vais tester les morceaux de codes que tu as fournis en espérant que cela fonctionnera bien sans trop avoir d'ajustements à faire, sinon je crains de devoir revenir te demander conseil assez rapidement ^^

    J'essaye tout ça dans les prochains jours, merci encore, et je te tiens au courant si cela marche ou non.

    Bien cordialement,

    --
    Shennong

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    @Shennong :

    Pas de quoi,

    Bonne journée et bon codage.

  5. #5
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Salut Wallace1,

    Désolé mais je ne comprends pas ce qu'il faut mettre dans l'étape 4, dans le 'If'. Peux-tu m'éclairer stp ?

    Aussi, J'ai bien incrémenté ma liste avec tous les url nécessaires selon les checkbox qui seront cochées par l'utilisateur, mais lorsque je les compte à la fin, je n'en ai qu'une dans la liste. J'ai fais comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        If chk_01.Checked = True Then
                adresses.Enqueue(adresse1)
                atari = 1
            ElseIf chk_02.Checked = True Then
                adresses.Enqueue(adresse2)
                pcengine = 1
            ElseIf chk_03.Checked = True Then
                adresses.Enqueue(adresse3)
                sega = 1
    ...
    msgbox(adresses.count)
    Et le msgbox n'affiche que "1" même si je coche 5 cases. Puis, j'ai essayé de les décocher et d'en recocher trois, et là il m'affichait "2". Je ne comprends pas pourquoi toutes les cases cochées ne sont pas bien implémentée à la liste.

    Merci d'avance.

    Cordialement,

    --
    Shennong

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Shennong Voir le message
    Désolé mais je ne comprends pas ce qu'il faut mettre dans l'étape 4, dans le 'If'. Peux-tu m'éclairer stp ?
    le code de l'étape 5 à priori

    ce n'est qu'une des manières de faire, en simultanné ca pourrait potentiellement gagner un peu de temps, mais le code serait différent

    ce qu'il faut comprendre, c'est que si tu déclares ta variable qui sert à télécharger dans ta form, elle ne peut faire qu'une chose à la fois, il faut donc en instancier une par fichier à télécharger
    après pour garder une référence vers toutes les instances il faut une collection (= tableau de variable en mieux)


    Citation Envoyé par Shennong Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        If chk_01.Checked = True Then
                adresses.Enqueue(adresse1)
                atari = 1
            ElseIf chk_02.Checked = True Then
                adresses.Enqueue(adresse2)
                pcengine = 1
            ElseIf chk_03.Checked = True Then
                adresses.Enqueue(adresse3)
                sega = 1
    ...
    msgbox(adresses.count)
    Et le msgbox n'affiche que "1" même si je coche 5 cases. Puis, j'ai essayé de les décocher et d'en recocher trois, et là il m'affichait "2". Je ne comprends pas pourquoi toutes les cases cochées ne sont pas bien implémentée à la liste.
    parce que c'est le fonctionnement de ElseIf qui signifie sinon si (donc nouveau test seulement si le 1er à échoué)
    donc si chk1 est coché, tu rentres dans le 1er if, puis tu passes directement au End If

    il te faudrait donc un if/end if par chk
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    sinon pour tes checkbox, au lieu de les poser (si tu en as plus de 5 par exemple) et donc d'avoir du code if chk01 if chk02 ... tu peux aussi les créer par code
    je ne vois pas ce que atari = 1 et autres font dans l'histoire sinon j'aurais pu te proposer du code pour le tout en plus simple
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    @Pol63 : je valide l'insertion de l'étape 5 dans le corps de la méthode en étape 4.

    @Shennong : Je valide également qu'il faille mettre un test conditionnel pour chaque checkbox pour ajouter (au besoin) les adresses dans la collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       If chk_01.Checked = True Then
                adresses.Enqueue(adresse1)
                atari = 1
        End if
        If chk_02.Checked = True Then
                adresses.Enqueue(adresse2)
                pcengine = 1
         End if
         If chk_03.Checked = True Then
                adresses.Enqueue(adresse3)
                sega = 1
         End if
    PS : même si au regards de ton code il existe certainement qqch d'un peu plus optimisé ..... tu pourrais utiliser par exemple un contrôle Listview (+ Checkbox et Progressbar embedded) ainsi ça t'éviterait le code redondant et en une boucle tu ajouterai les adresses à la file d'attente !

    ...bon d accords je m'enflamme un peu...lol ...on va déjà voir ensemble pour faire fonctionner tout ca

  9. #9
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Merci à vous deux, je comprends (un peu) mieux. Dans l'esprit d'être clair et que vous voyez bien l'étendue de la form, je vous présente ici le code complet que j'ai pour le moment (donc en construction)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    Imports System.Net
    Imports Microsoft.Win32
    Imports System.IO
     
    Public Class Repair
     
        Dim atari As Integer
        Dim pcengine As Integer
        Dim sega As Integer
        Dim dreamcast As Integer
        Dim gameboy As Integer
        Dim nes As Integer
        Dim supernes As Integer
        Dim n64 As Integer
        Dim psp As Integer
        Dim ps1 As Integer
        Dim ps2 As Integer
        Dim console As String
        Private adresses As New Queue(Of String)()
        Private WithEvents httpclient As WebClient
     
     
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btn_annuler.Click
     
            'On ferme la fenêtre
            Me.Close()
     
        End Sub
     
     
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_reparer.Click
     
            'On ajoute les adresses de téléchargement des émulateurs à la collection d'adresses de téléchargement 'adresses'
            If chk_01.Checked = True Then
                adresses.Enqueue("adresse01")
                atari = 1
            End If
            If chk_02.Checked = True Then
                adresses.Enqueue("adresse02")
                pcengine = 1
            End If
            If chk_03.Checked = True Then
                adresses.Enqueue("adresse03")
                sega = 1
            End If
            If chk_04.Checked = True Then
                adresses.Enqueue("adresse04")
                dreamcast = 1
            End If
            If chk_05.Checked = True Then
                adresses.Enqueue("adresse05")
                gameboy = 1
            End If
            If chk_06.Checked = True Then
                adresses.Enqueue("adresse06")
                nes = 1
            End If
            If chk_07.Checked = True Then
                adresses.Enqueue("adresse07")
                supernes = 1
            End If
            If chk_08.Checked = True Then
                adresses.Enqueue("adresse08")
                n64 = 1
            End If
            If chk_09.Checked = True Then
                adresses.Enqueue("adresse09")
                psp = 1
            End If
            If chk_10.Checked = True Then
                adresses.Enqueue("adresse10")
                ps1 = 1
            End If
            If chk_11.Checked = True Then
                adresses.Enqueue("adresse11")
                ps2 = 1
            End If
     
        End Sub
     
        Private Sub DownloadF(dirPath$)
     
            If adresses.Any() Then
     
                Using wc As New WebClient
                    With wc
                        AddHandler .DownloadProgressChanged, AddressOf DownloadF_DownloadProgressChanged
                        AddHandler .DownloadFileCompleted, AddressOf DownloadF_DownloadFileCompleted
                        'L'url "s" est retournée et ensuite supprimée de la liste avec la méthode Dequeue
                        Dim s = adresses.Dequeue()
                        ' On s'attarde ici à tout ce qui pourrait être utile en vue de constituer le chemin de destination du fichier téléchargé !
                        Dim fiName As New FileInfo(New Uri(s).AbsolutePath)
                        ' A noter que le 3ème argument est nécessaire pour relancer la méthode DownloadF s'il reste des fichiers en file d'attente dans l'event Completed !
                        .DownloadFileAsync(New Uri(s), dirPath & "\" & fiName.Name, dirPath)
                    End With
                End Using
                Return
     
            End If
     
        End Sub
     
        Private Sub httpclient_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles httpclient.DownloadFileCompleted
     
            Dim rep As MsgBoxResult
            rep = MsgBox("La réparation est terminée !." & vbCrLf & vbCrLf & "Vous pouvez désormais utiliser le ou les émulateur(s).", vbOKOnly + vbInformation, "Téléchargement terminé !")
     
            If rep = vbOK Then
                lbl_01.Visible = False
                lbl_emu.Visible = False
                lbl_dl.Visible = False
                ProgressBar1.Visible = False
                chk_01.Enabled = True
                chk_02.Enabled = True
                chk_03.Enabled = True
                chk_04.Enabled = True
                chk_05.Enabled = True
                chk_06.Enabled = True
                chk_07.Enabled = True
                chk_08.Enabled = True
                chk_09.Enabled = True
                chk_10.Enabled = True
                chk_11.Enabled = True
                btn_annuler.Enabled = True
                btn_reparer.Enabled = True
                chk_01.Checked = False
                chk_02.Checked = False
                chk_03.Checked = False
                chk_04.Checked = False
                chk_05.Checked = False
                chk_06.Checked = False
                chk_07.Checked = False
                chk_08.Checked = False
                chk_09.Checked = False
                chk_10.Checked = False
                chk_11.Checked = False
                atari = 0
                pcengine = 0
                sega = 0
                dreamcast = 0
                gameboy = 0
                nes = 0
                supernes = 0
                n64 = 0
                psp = 0
                ps1 = 0
                ps2 = 0
            End If
     
        End Sub
     
        Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles httpclient.DownloadProgressChanged
     
            ProgressBar1.Value = e.ProgressPercentage
            lbl_dl.Text = e.ProgressPercentage.ToString & " %"
            lbl_emu.Text = console
     
        End Sub
     
        Private Sub Repair_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
            atari = 0
            pcengine = 0
            sega = 0
            dreamcast = 0
            gameboy = 0
            nes = 0
            supernes = 0
            n64 = 0
            psp = 0
            ps1 = 0
            ps2 = 0
     
        End Sub
     
    End Class
    Les variable "nomdeconsole = 0 ou =1" me servent ensuite pour savoir quelles émulateurs ont été téléchargés, pour les opérations suivantes (suppression du dossier déjà présent dans l'install, puis copie du nouveau à la place). Si telle console est à 1, alors je vérifie que le dossier de base existe, si oui je le supprime, si non, je ne fais rien. Puis je copie le nouveau dossier à la place.

    J'espère que c'est clair, je sais pas trop comment expliquer autrement ^^

    Il y a aussi des parties httpclient, qui font référence à un webclient que j'ai essayé d'utiliser avant. Cela fonctionnait bien pour un seul fichier.

    De plus, je ne sais pas si c'est bien ça que tu attendais Wallace1, mais j'ai donc inséré le code de l'étape 5 dans la fonction créée à l'étape 4. Malheureusement, j'ai une erreur de type :

    "Erreur 4 'DownloadF_DownloadFileCompleted' n'est pas déclaré. Il peut être inaccessible en raison de son niveau de protection."

    et la même chose pour 'DownloadF_DownloadProgressChanged'

    Pour finir, voici un screen du form en question (les checkbox sont numérotées du haut vers le bas, des colonnes de gauche à droite). La progressbar se nomme "Progressbar1", le label pour le % d'avancement est "lbl_dl" et celui pour afficher le nom de la console téléchargée est "lbl_emu".

    Nom : Sans titre-2.png
Affichages : 466
Taille : 200,4 Ko

    J'espère que vous pourrez vous y retrouver :s

    Merci d'avance pour votre aide !

    Cordialement,

    --
    Shennong

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en programmation, il y a bien sur le fait que le code marche, mais il y a aussi la maintenabilité du code
    à savoir que le code soit simple et évolutif

    là si demain tu dois rajouter une console, tu vas devoir poser un checkbox, rajouter du code dans tes ifs, rajouter du code pour le téléchargement, rajouter une variable pour la console etc...
    (au passage une valeur qui a 0 ou 1 c'est un bit, booléen en .net, pas un integer ; dim a as boolean = false)

    la poo a permis de rendre tout ceci plus simple
    dans ton cas les données ne viennent pas d'une base de données, mais ca reste automatisable

    1ère chose, on peut ajouter un controle à l'exécution
    donc pour chaque console, tu pourras ajouter le checkbox
    ensuite pour chaque console tu as besoin de savoir l'adresse de téléchargement, et plein d'autres choses
    aussi on fait donc une classe qui va stocker toutes ces valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Console
      public property Nom as string
      public property AdresseDL as string
      public property Installé as boolean
    end class
    ensuite il va falloir définir quelles sont les concoles, pour celà on le fait au démarrage de l'application (form_load ou sub new)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private _Consoles as new list(of console)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dim c as new console
    c.Nom = "Atari"
    c.AdresseDL = "http://...."
    _Consoles.add(c)
    c = new console ' ici c'est de la réutilisation de variable mais avec une nouvelle instance, donc pas d’interférence avec la 1ère)
    c.Nom = "NES"
    c.AdresseDL = "http://..."
    _Consoles.add(c)
    '...
    ensuite pour ajouter les checkbox, il faut d'abord poser un flowlayoutpanel sur le form puis faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for each c in _Consoles
       dim chk as new checkbox
       chk.Text = c.Nom
       chk.Tag = c
       me.FlowLayoutPanel1.Controls.Add(chk)
    next
    à ce niveau l'interface se fait
    le FlowLayoutPanel est un controle container qui s'occupe de la disposition de ses enfants, pas besoin de définir l'emplacement, il les pose automatiquement à côté des autres, et passe à la ligne tout seul (tu peux gérer les marges entre chaque etc...)
    .Tag c'est une propriété qui existe sur tous les controles, permettant de stocker n'importe quoi, ici on va y ranger l'instance de console liée (je ne sais pas encore si c'est utile, il est peut etre plus utile de ranger le checkbox sur la console)

    après sur le clic du bouton Réparer, le but est de faire For Each checkbox coché un traitement, là on récupère la console liée au checkbox pour connaitre l'url et lancer le téléchargement

    là on voit donc que le code va se limiter à des boucles, pas 10 if à la suite
    et si tu dois rajouter une console, tu n'as qu'une ligne de code à ajouter, et pas l'appli entière à retester pour vérifier que tu n'as pas oublié de modifier un truc
    de plus le code est simple et concis, il n'y a rien de redondant

    tu peux ajouter plein de choses sur la classe console, comme une Public Sub Telecharger, qui contiendrait le code de téléchargement
    ton code sur le bouton réparer serait alors
    pour chaque console dont le checkbox est coché
    console.Telecharger
    et donc pour les progressbar tu peux intégrer ca aussi, que chaque progressbar s'ajoute automatiquement, avec le nom de la console automatiquement au dessus

    normalement on ne recommande pas ça, mais tu peux mettre une propriété as Checkbox et une propriété as ProgressBar sur la classe console, et y ranger les instances un fois créées, ce qui fait qu'avec un for each sur _Consoles tu peux savoir si c.Checkbox.Checked, ou modifier facilement le pourcentage d'avancement
    Je dis qu'en général on ne recommande pas ça, c'est parce qu'il est plutot conseillé de ne pas lier ses classes à ses controles, ce qui rend le code plus évolutif, mais c'est un peu plus complexe, si déjà tu arrives à utiliser tout ca tu verras tu auras déjà appris beaucoup, et sur ta prochaine appli tu pourras réfléchir comment ne pas lier tout tout en gardant du code simple


    un autre point technique intéressant c'est LINQ qui permet d'écrire des boucles facilement
    par exemple la recherche des consoles dont le checkbox est coché si tu as mis le chk sur la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For each c as Console in (from cn in _Consoles where cn.Checkbox.Checked Select cn)
      c.Telecharger
    Next
    ici le (from ...) va faire le tour, donc c'est une boucle qui te ressort ce que tu lui mets en condition
    après on peux même réduire à nouveau car c'est une boucle qu'on fait derrière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (from cn in _Consoles where cn.Checkbox.Checked Select cn).ForEach(j'ai pu la syntaxe exacte .Telecharger)
    ce qui fait que pour chaque instance trouvée par le where tu vas appeler la méthode
    attention tout de même, linq réduit le nombre de lignes, mais agrandit la taille de celles ci et il faut s'arrêter quand ca devient illisible
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    en programmation, il y a bien sur le fait que le code marche, mais il y a aussi la maintenabilité du code
    à savoir que le code soit simple et évolutif
    Et surtout facilement réutilisable dans d'autres projets "perso" ou réutilisable dans des projets d'autres développeurs.

    Il faut garder à l'esprit qu'un projet quel qu'il soit contiendra d'une manière ou d'une autre du code réutilisable (sous forme de classes ou librairies c'est l'idéal), alors c'est en ce sens qu'il faut orienter ta conception de projet.
    T'es-tu déjà posés ces questions :
    - comment identifier qu'une classe est nécessaire dans un projet
    - comment modéliser une classe

    Les réponses t'amèneront à coups sur dans les fondements mêmes de la POO.

    Comme l'a mentionné Pol63 et je fais partie de cette même école : il faut bien séparer la notion d'affichage et de traitements pour une question de ré-utilisabilité (maintenabilité/évolutivité) en somme !

    Un projet contient dans la majeure partie des cas :
    - un noyau principal qui concerne la partie fonctionnelle en général (Core)
    - les outils ou fonctions utiles (Helper)
    - le paramétrage de l'application (Settings) qui concerne la gestion des fichiers Ini, xml,....
    - des sous-projets ou classes indépendantes (des librairies codées pour les circonstances)

    Si tu as d'autres questions n'hésites pas.

    Cdlt.

  12. #12
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    @Shennong : Voilà en quelque sorte ce qui pourrait introduire la notion de réutilisable :

    ---> La classe "DownloadFiles" (de l'espace de nom "Download") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    Imports System.Net
    Imports System.IO
    Imports System.ComponentModel
     
    Namespace Download
        Public Class Cls_DownloadFiles
     
    #Region " Properties "
            Property downloadUrls As Queue(Of Cls_Url)
    #End Region
     
    #Region " Events "
            Public Shared Event ProgressChangedEvent As ProgressChangedDelegate
            Public Shared Event TerminatedEvent As EventHandler
    #End Region
     
    #Region " Delegates "
            Public Delegate Sub ProgressChangedDelegate(sender As Object, e As DownloadProgressChangedEventArgs)
    #End Region
     
    #Region " Methods "
            Public Sub New()
                downloadUrls = New Queue(Of Cls_Url)
            End Sub
     
            Public Sub DownloadF()
                ' On vérifie que la liste n'est pas vide à chaque lancement de la routine
                If downloadUrls.Any() Then
                    ' On instancie un objet de la classe WebClient pour chaque téléchargement de fichier
                    Using wc As New WebClient
                        With wc
                            ' On s'abonne dynamiquement aux 2 events (DownloadProgressChanged et DownloadFileCompleted) de l'instance Wc
                            AddHandler .DownloadProgressChanged, AddressOf DownloadF_DownloadProgressChanged
                            AddHandler .DownloadFileCompleted, AddressOf DownloadF_DownloadFileCompleted
                            'L'url "s" est retournée et ensuite supprimée de la liste avec la méthode Dequeue
                            Dim s = downloadUrls.Dequeue()
                            ' On s'attarde ici à tout ce qui pourrait être utile en vue de constituer le chemin de destination du fichier téléchargé !
                            Dim fiName As New FileInfo(New Uri(s.AdresseDL).AbsolutePath)
                            ' A noter que le 3ème argument permet de savoir côté UI quel fichier est en cours de téléchargement !
                            .DownloadFileAsync(New Uri(s.AdresseDL), s.DestDir & "\" & fiName.Name, s.AdresseDL)
                        End With
                    End Using
                    Return
                Else
                    ' C'est ici qu'on déclenche un event pour dire que le téléchargement de tous les fichiers est bien terminé !
                    RaiseEvent TerminatedEvent(Me, New EventArgs)
                End If
            End Sub
     
            Private Sub DownloadF_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)
                ' On déclenche l'event ProgressChangedEvent pour permettre la MAJ de la progressbar côté UI
                RaiseEvent ProgressChangedEvent(sender, e)
            End Sub
     
            Private Sub DownloadF_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
                ' On masque cet event côté UI car il permet de savoir à quel moment se termine la fin du téléchargement de chaque fichier !
                If e.Error IsNot Nothing Then
                    MsgBox(e.Error.ToString)
                End If
                DownloadF()
            End Sub
    #End Region
     
        End Class
    End Namespace
    ---> La classe Url qui permet d'y placer les urls, noms et répertoire d'enregistrement cibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Namespace Download
        Public Class Cls_Url
     
            Public Property Nom As String
            Public Property AdresseDL As String
            Public Property DestDir As String
     
        End Class
    End Namespace
    ---> Et son utilisation pour quelques urls de mon cru (nécessite une Progressbar, 1 bouton et 1 label) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Imports System.Net
    Imports System.ComponentModel
    Imports DownloadFilesProject.Download
     
    Public Class Form1
     
        Private WithEvents DL As New Cls_DownloadFiles()
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            Dim url1 As New Cls_Url() With {.Nom = "GC", .AdresseDL = "http://wallace87000.upd.fr/Gif Animation Creator.exe", .DestDir = "D:\Sauvegardes"}
            DL.downloadUrls.Enqueue(url1)
            Dim url2 As New Cls_Url() With {.Nom = "IU", .AdresseDL = "http://wallace87000.upd.fr/ImaboxUploader.exe", .DestDir = "D:\Sauvegardes"}
            DL.downloadUrls.Enqueue(url2)
     
            DL.DownloadF()
        End Sub
     
        Private Sub DownloadF_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs) Handles DL.ProgressChangedEvent
            ProgressBar1.Value = e.ProgressPercentage
            Label1.Text = e.UserState.ToString
        End Sub
     
        Private Sub Terminated() Handles DL.TerminatedEvent
            MsgBox("terminé")
        End Sub
     
    End Class
    ATTENTION : je ne dis pas que la classe est tout ce qu'il y a de plus authentique et optimisé ...mais tu peux déjà t'en inspirer et te faire une idée d'un éventuel rendu.
    --> On pourrait aussi penser à libérer quelques ressource à la fin du téléchargement (une méthode dispose) ou alors attendre le passage du GC..... passivement....
    --> Vérifier l'existence des répertoires de destination
    --> Créer un gestionnaire d'exception en cas d'interruption de téléchargement
    --> Créer un eventArgs (une classe qui hérite d'un eventargs) qui transporterait le message du nombre de DL réussi et/ou en échecs dans l'event Terminated .....
    ...etc.....

    J'espère que cela t'aidera.

    N'hésites pas si tu as des questions ...tout le contenu peut faire l'objet d'un débat.....

    Cdlt.

    A+

  13. #13
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Bonjour bonjour,

    Je viens de relire tout le post pour me remettre les idées en place. D'abord je tiens à vous remercier énormément pour l'aide que vous m'apportez. Cependant, vos solutions dépassent mes compétences actuelles en VB et franchement, je n'y comprend plus rien ^^'

    Du coup, je me dis que je vais peut-être faire plus simple, et proposer une fonction de réparation globale. Comme ça je n'aurai qu'un seul fichier à télécharger et à dézipper. Cela fonctionnera, je sais le faire

    Malheureusement, j'ai beau lire et relire, je ne comprends rien à la façon de faire. Donc si quelqu'un peut me proposer un bout de code complet que je puisse utiliser et aussi et surtout sur lequel me pencher pour essayer de mieux comprendre, je suis preneur, car là je suis vraiment paumé ! ^^

    Merci beaucoup encore une fois pour votre aide !

    Cordialement,

    --
    Shennong

  14. #14
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Shennong Voir le message
    Cependant, vos solutions dépassent mes compétences actuelles en VB et franchement, je n'y comprend plus rien ^^'
    Je peux comprendre que quelque notions te paraissent obscures mais cela n'éveille pas ta curiosité ?
    Qu'est ce que tu ne comprends pas ?

    Malheureusement, j'ai beau lire et relire, je ne comprends rien à la façon de faire.
    J'ai dis dans mon precedent message que le contenu peut faire l objet d'un debat.....tu peux commencer par dire ce que tu n arrives pas a faire ........... les points noires voir bloquants.....


    .......me proposer un bout de code complet que je puisse utiliser et aussi et surtout sur lequel me pencher pour essayer de mieux comprendre, je suis preneur, car là je suis vraiment paumé ! ^^
    On a déjà passé ce cap (cf plus haut les exemples commentés)...... la balle est dans ton camps pour la suite...

    cdlt.

  15. #15
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Accessoirement j'ai agrémenté le tout sous forme de classe :

    http://3dotdevcoder.blogspot.fr/2015...s-en-file.html

    PS : si cela ne peut t'aider davantage..peut être que ça restera utile pour d'autres.

    A+

  16. #16
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Merci pour le lien, je vais essayer de reprendre ça et de comprendre en cherchant sur internet. Je vais bien finir par comprendre le code ^^

    Je suis de garde ce week end, et je sais pas trop quand je pourrais me remettre au développement de mon appli pour le moment, mais si j'aboutis à quelque chose, je vous tiendrai informé sur ce thread.

    Merci encore pour votre aide en tout cas, et je pense que oui, ça finira par être utile à quelqu'un d'autre, j'en suis convaincu

    A+

    --
    Shennong

  17. #17
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir Shennong,

    On peux considérer que des réponses ont été apportées à ta question. Tu peux passer le topic en résolu. Si tu rencontres un autre problème tu pourras ouvrir un autre sujet sinon ca risque d'être difficilement compréhensible à force ....

    Cdlt.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/09/2013, 20h17
  2. Téléchargement de fichier
    Par casafa dans le forum Web & réseau
    Réponses: 21
    Dernier message: 18/06/2009, 23h34
  3. Réponses: 5
    Dernier message: 05/11/2005, 17h53
  4. [SOAP][XML][C#.NET] Téléchargement de fichiers XML
    Par juniorAl dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 27/06/2005, 09h35
  5. Gestion des permissions des fichiers sur NTFS
    Par gnu_thomas dans le forum MFC
    Réponses: 3
    Dernier message: 22/01/2004, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo