Téléchargement de fichier calculer la vitesse et le progrès milieu ouvrier et barre de progression
Voici un code qui fera usage de VB.NET l 'classe BackgroundWorker et lancer une requête Web pour télécharger un fichier. Il va calculer la vitesse du fichier ainsi que d'indiquer ses progrès sur une barre de progression. Tout en gardant la forme principale de disponibles.
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 178 | 'Where the program save the file Delegate Sub ChangeTextsSafe ( ByVal length As Long , ByVal position As Integer , ByVal percent As Integer , ByVal speed As Double ) Delegate Sub DownloadCompleteSafe ( ByVal cancelled As Boolean ) Public Sub DownloadComplete ( ByVal cancelled As Boolean ) Me . txtFileName . Enabled = True Me . btnDownload . Enabled = True Me . btnCancel . Enabled = False If cancelled Then Me . Label4 . Text = "Cancelled" 'MessageBox.Show("Download aborted", "Aborted", MessageBoxButtons.OK, MessageBoxIcon.Information) Else Me . Label4 . Text = "Successfully downloaded" 'MessageBox.Show("Successfully downloaded!", "All OK", MessageBoxButtons.OK, MessageBoxIcon.Information) End If Me . ProgressBar1 . Value = 0 Me . Label5 . Text = "Downloading: " Me . Label6 . Text = "Save to: " Me . Label3 . Text = "File size: " Me . Label2 . Text = "Download speed: " Me . Label4 . Text = "" End Sub Public Sub ChangeTexts ( ByVal length As Long , ByVal position As Integer , ByVal percent As Integer , ByVal speed As Double ) Me . Label3 . Text = "File size: " & Math. Round ( ( length / 1024 ) , 2 ) & " KB" Me . Label5 . Text = "Downloading: " & Me . txtFileName . Text Me . Label4 . Text = "Downloaded " & Math. Round ( ( position / 1024 ) , 2 ) & " KB of " & Math. Round ( ( length / 1024 ) , 2 ) & "KB (" & Me . ProgressBar1 . Value & "%)" If speed = - 1 Then Me . Label2 . Text = "Download speed: calculating..." Else Me . Label2 . Text = "Download speed: " & Math. Round ( ( speed / 1024 ) , 2 ) & " KB/s" End If Me . ProgressBar1 . Value = percent End Sub Private Sub btnDownload_Click ( ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles btnDownload. Click If Me . txtFileName . Text <> "" AndAlso Me . txtFileName . Text . StartsWith ( "http://" ) Then Me . SaveFileDialog1 . FileName = Me . txtFileName . Text . Split ( "/" c ) ( Me . txtFileName . Text . Split ( "/" c ) . Length - 1 ) If Me . SaveFileDialog1 . ShowDialog = Windows. Forms . DialogResult . OK Then Me . whereToSave = Me . SaveFileDialog1 . FileName Me . SaveFileDialog1 . FileName = "" Me . Label6 . Text = "Save to: " & Me . whereToSave Me . txtFileName . Enabled = False Me . btnDownload . Enabled = False Me . btnCancel . Enabled = True Me . BackgroundWorker1 . RunWorkerAsync ( ) 'Start download End If Else MessageBox. Show ( "Please insert valid URL for download" , "Warning" , MessageBoxButtons. OK , MessageBoxIcon. Warning ) End If End Sub Private Sub btnCancel_Click ( ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles btnCancel. Click Me . BackgroundWorker1 . CancelAsync ( ) 'Send cancel request Try Me . bckZip . CancelAsync ( ) Catch ex As Exception 'Do Nothing End Try End Sub Private Sub BackgroundWorker1_DoWork ( ByVal sender As System. Object , ByVal e As System. ComponentModel . DoWorkEventArgs ) Handles BackgroundWorker1. DoWork 'Creating the request and getting the response Dim theResponse As HttpWebResponse Dim theRequest As HttpWebRequest Try 'Checks if the file exist theRequest = WebRequest. Create ( Me . txtFileName . Text ) theResponse = theRequest. GetResponse theRequest. Timeout = 10000000 Catch ex As Exception MessageBox. Show ( "An error occurred while downloading file. Possibe causes:" & ControlChars. CrLf & _ "1) File doesn't exist" & ControlChars. CrLf & _ "2) Remote server error" , "Error" , MessageBoxButtons. OK , MessageBoxIcon. Error ) Dim cancelDelegate As New DownloadCompleteSafe ( AddressOf DownloadComplete ) Me . Invoke ( cancelDelegate, True ) Exit Sub End Try Dim length As Long = theResponse. ContentLength 'Size of the response (in bytes) Dim safedelegate As New ChangeTextsSafe ( AddressOf ChangeTexts ) Me . Invoke ( safedelegate, length, 0 , 0 , 0 ) 'Invoke the TreadsafeDelegate Dim writeStream As New IO. FileStream ( Me . whereToSave , IO. FileMode . Create ) 'Replacement for Stream.Position (webResponse stream doesn't support seek) Dim nRead As Integer 'To calculate the download speed Dim speedtimer As New Stopwatch Dim currentspeed As Double = - 1 Dim readings As Integer = 0 Do If BackgroundWorker1. CancellationPending Then 'If user abort download Exit Do End If speedtimer. Start ( ) Dim readBytes ( 4096 ) As Byte Dim bytesread As Integer = theResponse. GetResponseStream . Read ( readBytes, 0 , 4096 ) nRead += bytesread Dim percent As Integer = ( nRead / length ) * 100 Me . Invoke ( safedelegate, length, nRead, percent, currentspeed ) If bytesread = 0 Then Exit Do writeStream. Write ( readBytes, 0 , bytesread ) speedtimer. Stop ( ) readings += 1 If readings > = 5 Then 'For increase precision, the speed it's calculated only every five cicles currentspeed = 20480 / ( speedtimer. ElapsedMilliseconds / 1000 ) speedtimer. Reset ( ) readings = 0 End If Loop 'Close the streams theResponse. GetResponseStream . Close ( ) writeStream. Close ( ) If Me . BackgroundWorker1 . CancellationPending Then IO. File . Delete ( Me . whereToSave ) Dim cancelDelegate As New DownloadCompleteSafe ( AddressOf DownloadComplete ) Me . Invoke ( cancelDelegate, True ) Exit Sub End If Dim completeDelegate As New DownloadCompleteSafe ( AddressOf DownloadComplete ) Me . Invoke ( completeDelegate, False ) End Sub whereToSave Dim As String 'Lorsque le programme de sauvegarder le fichier sous ChangeTextsSafe délégué (longueur ByVal As Long, ByVal position As Integer, ByVal pour cent As Integer, ByVal As Double vitesse) Délégué Sous DownloadCompleteSafe (ByVal annulé As Boolean) Public Sub DownloadComplete (ByVal annulée As Boolean) Me. txtFileName. Enabled = True moi. btnDownload. Enabled = True moi. btnCancel. Enabled = False En cas d'annulation m'a ensuite. Label4. Text = "Annulée" 'MessageBox.Show ("Download" avortée "abandonnée", , MessageBoxIcon.Information) Sinon moi. Label4 MessageBoxButtons.OK. Text = "téléchargé avec succès" 'MessageBox.Show ("téléchargé avec succès!", "tout est OK", MessageBoxButtons.OK, MessageBoxIcon.Information) End If Me. progressBar1. Valeur = 0 Me. Label5. Text = "Téléchargement:" Moi. Label6. Text = "Enregistrer dans:" Moi. Label3. Text = "Taille du fichier:" Moi. Label2. Text = "Vitesse de téléchargement:« Moi. Label4. Texte "" End Sub Public Sub ChangeTexts (ByVal longueur Long, ByVal position Integer, ByVal pour cent Integer, ByVal double vitesse) Me. Label3 =. Text = "Taille du fichier:" et des opérations. Round ((longueur / 1024) , 2) & "KB" Moi. Label5. Text = "Téléchargement:" Me &. txtFileName. Me. Label4 texte. Text = "Téléchargé" et des opérations. Round ((position / 1024), 2) & "KB" et des opérations. Round ((longueur / 1024), 2) & "Ko (" & Me. progressBar1. Value & "%)" Si la vitesse = - 1 puis me. Label2. Text = "Vitesse de téléchargement: calcul ..." Sinon moi. Label2. Text = "Vitesse de téléchargement:« et des opérations. Round ((vitesse / 1024), 2) & "Ko / s" End If Me. progressBar1. Valeur pour cent Fin = Private Sub btnDownload_Click (ByVal sender As System . Object, ByVal e As System. EventArgs) Handles btnDownload. Cliquez Si moi. txtFileName. Texte <> "" AndAlso moi. txtFileName. Texte. startsWith ("http://") puis moi. SaveFileDialog1. FileName = Me. txtFileName . Texte. Split ("/" c) (Me. txtFileName. Texte. Split ("/" c). Longueur - 1) Si moi. SaveFileDialog1. ShowDialog = Windows. Forms. DialogResult. OK puis me. whereToSave Me =. SaveFileDialog1. FileName moi. SaveFileDialog1. FileName = "" Moi. Label6. Text = "Enregistrer dans:" & Me. Me whereToSave. txtFileName. Enabled = False moi. btnDownload. Enabled = False moi. btnCancel. Enabled = True moi. BackgroundWorker1 . RunWorkerAsync () 'End If Else Démarrer le téléchargement MessageBox. Show ("valide insérer URL S'il vous plaît pour" télécharger, "Attention", MessageBoxButtons. OK, MessageBoxIcon. Warning) End If End Sub Private Sub btnCancel_Click (ByVal sender As System. Object, e comme système. EventArgs) Handles btnCancel ByVal. Cliquez-moi. BackgroundWorker1. CancelAsync () 'Envoyer demande d'annulation vais essayer. bckZip. CancelAsync () Catch ex As Exception' Ne Nothing End Try End Sub Private Sub BackgroundWorker1_DoWork (ByVal sender As System. Object, ByVal e As System. ComponentModel. DoWorkEventArgs) Poignées BackgroundWorker1. DoWork 'Création de la demande et obtenir la réponse en theResponse Dim Dim HttpWebResponse theRequest Comme HttpWebRequest Try' vérifie si le fichier existe theRequest = WebRequest. Créer (Me. txtFileName. Texte) theResponse = theRequest. theRequest GetResponse. Timeout = 10000000 Catch ex As Exception MessageBox. Show ("Une erreur s'est produite lors du téléchargement du fichier. possibe causes:" & ControlChars. CrLf & _ "1) Le fichier n'existe pas" et ControlChars. CrLf & 2) à distance Server Error "_", "Erreur", MessageBoxButtons. OK, MessageBoxIcon. Error) cancelDelegate Dim en tant que nouvelle DownloadCompleteSafe (AddressOf DownloadComplete) Me. Invoke (cancelDelegate, True) Exit Sub End Try Dim longueur As Long = theResponse. ContentLength «Taille de la réponse (en octets) safedelegate Dim ChangeTextsSafe (AddressOf ChangeTexts) Me. Invoke (safedelegate, longueur, 0, 0, 0) 'Appel de la TreadsafeDelegate writeStream Comme Dim New IO. FileStream (Me. whereToSave Nouvelle, IO. . Créez) «Remplacement pour FileMode Stream.Position (flux WebResponse ne supporte pas les chercher) Dim nRead As Integer 'Pour calculer la vitesse de téléchargement speedtimer Dim Dim New Chronomètre currentspeed As Double = - lectures Dim 1 As Integer = 0 Ne Si BackgroundWorker1 . CancellationPending Then 'Si le téléchargement sortie avorter utilisateur ne End If speedtimer. Start () Dim readBytes (4096) As Byte Dim bytesRead As Integer = theResponse. GetResponseStream. Lire (readBytes, 0, 4096) + = nRead bytesRead pour cent Dim As Integer = (nRead / longueur) * 100 Me. Invoke (safedelegate, longueur, nRead, pour cent, currentspeed) Si bytesRead = 0 Then Exit Do writeStream. Write (readBytes, 0, bytesRead) speedtimer. Stop () + = 1 lectures Si les lectures> = 5 Then 'Pour augmenter la précision, la vitesse il est calculé que tous les cinq cicles currentspeed = 20480 / (speedtimer. ElapsedMilliseconds / 1000) speedtimer. Reset () = 0 lectures End If' Fermer la boucle du flux theResponse. GetResponseStream. Close () writeStream . Close () If Me. BackgroundWorker1. CancellationPending Puis IO. Fichier. Supprimer (Me. whereToSave) Dim cancelDelegate As New DownloadCompleteSafe (AddressOf DownloadComplete) Me. Invoke (cancelDelegate, True) Exit Sub End If completeDelegate Dim en tant que nouvelle DownloadCompleteSafe (AddressOf DownloadComplete Me). Invoke (completeDelegate, False) End Sub |













































