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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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 : 41
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    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
    Membre Expert
    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
    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 éclairé 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 : 41
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    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
    Membre Expert
    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
    Billets dans le blog
    7
    Par défaut
    @Shennong :

    Pas de quoi,

    Bonne journée et bon codage.

  5. #5
    Membre éclairé 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 : 41
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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

+ 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