Télécharger un fichier depuis FTP avec Progressbar et BackgroundWorker
par
, 18/11/2016 à 20h38 (1013 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