Voir le flux RSS

wallace1

Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker

Noter ce billet
par , 18/11/2016 à 20h38 (275 Affichages)
Je viens compléter le sujet concernant l'implémentation du BackgroundWorker et ses 3 events :

On vérifie si le Bgw n'est pas déjà en cours d'exécution :

Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 
        If Not Bgw.IsBusy Then
            Bgw.RunWorkerAsync()
        End If
    End Sub

On rentre dans le thread. Dans le corps de cette procédure on ne mets SURTOUT PAS A JOUR L'INTERFACE (LES CONTROLES) DU LOGICIEL ou alors on sort en appelant ReportProgress :

Code VB.NET : 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
 
   Private Sub Bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Bgw.DoWork
        Try
            '' la requête pour récupérer la taille du fichier 
            Dim dlReq As FtpWebRequest = CType(WebRequest.Create("ftp://x.x.x.x//folder/sub/distantFile.bin"), FtpWebRequest)
            dlReq.Credentials = New NetworkCredential("user", "pass")
            dlReq.Method = WebRequestMethods.Ftp.GetFileSize
            Dim response As FtpWebResponse = DirectCast(dlReq.GetResponse(), FtpWebResponse)
            Dim fileSize = response.ContentLength
 
            '' la requête pour télécharger le fichier
            dlReq = CType(WebRequest.Create("ftp://x.x.x.x//folder/sub/distantFile.bin"), FtpWebRequest)
            dlReq.Credentials = New NetworkCredential("user", "pass")
            dlReq.Method = WebRequestMethods.Ftp.DownloadFile
            Dim dlResp As FtpWebResponse = DirectCast(dlReq.GetResponse(), FtpWebResponse)
            Dim dlFile As Stream = dlResp.GetResponseStream()
 
            Using localFile As New FileStream("C:\tmp\localFile.bin", FileMode.Create)
 
                Dim Length As Integer = 2048
                Dim buffer As Byte() = New Byte(Length - 1) {}
                Dim bytesRead As Integer = dlFile.Read(buffer, 0, Length)
                Dim bytes As Integer = 0
 
                Dim totalBytesRead As Long = bytesRead
                While bytesRead > 0
                    localFile.Write(buffer, 0, bytesRead)
                    Bgw.ReportProgress(CInt(totalBytesRead * 100 / fileSize), fileSize)
                    bytesRead = dlFile.Read(buffer, 0, Length)
                    totalBytesRead += bytesRead
                End While
            End Using
            'On vérifie que le fichier téléchargé existe et qu'il pèse le bon poids.
            e.Result = Tuple.Create(File.Exists("C:\tmp\localFile.bin") AndAlso New FileInfo("C:\tmp\localFile.bin").Length = fileSize, "Opération réussie")
        Catch ex As Exception
            e.Result = Tuple.Create(False, "Echec de l'opération : " & vbNewLine & ex.ToString)
        End Try
    End Sub

On rentre dans cette procédure pour mettre à jour les contrôles côté UI (ici la barre de progression) :

Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
   Private Sub Bgw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles Bgw.ProgressChanged
        If Not e.ProgressPercentage > 100 Then
            ProgressBar1.Value = e.ProgressPercentage
        End If
    End Sub

Le thread se termine ici et PAS AILLEURS (avec gestion : opération réussie, erreur) :

Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
  Private Sub Bgw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles Bgw.RunWorkerCompleted
        Dim tup = TryCast(e.Result, Tuple(Of Boolean, String))
        If Not tup Is Nothing Then
            If tup.Item1 = True Then
                MessageBox.Show(tup.Item2, "Réussite", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageBox.Show(tup.Item2, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End If
        End If
    End Sub

Enjoy A+

Si besoin d'explications supplémentaires, il ne faut pas hésiter

Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Viadeo Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Twitter Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Google Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Facebook Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Digg Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Delicious Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog MySpace Envoyer le billet « Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker » dans le blog Yahoo

Mis à jour 16/08/2017 à 18h49 par Malick (Ajout balises code)

Catégories
DotNET , C# , VB.NET

Commentaires

  1. Avatar de cool18fr
    • |
    • permalink
    Bonjour, votre code m'aiderai beaucoup pour mon projet. Cela fait plusieurs heures que je bloque sur un problème. J'ai une erreur "Fichier non disponible" sur "WebRequestMethods.Ftp.GetFileSize". Aucun souci sur le download si je ne récupère pas la taille du fichier qui est essentiel... Merci