Download File cálculo de velocidade e marcha de fondo do traballador e Barra de Progreso
Aquí está o código que faga uso de VB.NET 's BackgroundWorker clase e iniciar unha solicitude da web para baixar un arquivo. El ha calcular a velocidade do ficheiro, así como indicar a súa evolución nunha barra de progreso. Todos os mantendo o formulario principal dispoñible.
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 Din whereToSave As String 'Se o programa gardar o arquivo Delegado Sub ChangeTextsSafe (ByVal lonxitude, desde a posición ByVal, como Enteiros cento ByVal, como Enteiros, ByVal velocidade como double) Delegado Sub DownloadCompleteSafe (ByVal cancelado As Booleano) Public Sub DownloadComplete (ByVal cancelado As Booleano) Me. txtFileName. Enabled = True Me. btnDownload. Enabled = True Me. btnCancel. Enabled = False Se cancelado logo a min. Label4. Text = "Cancelado" 'MessageBox.Show ("Download" abortar ", Aborted" , MessageBoxIcon.Information) Else Me. Label4 MessageBoxButtons.OK. Text = "baixados con éxito" 'MessageBox.Show ("baixados con éxito!", "All OK", MessageBoxButtons.OK, MessageBoxIcon.Information End) Se Me. ProgressBar1. Value Me = 0. Label5. Text = "Download:" Me. Label6. Text = "Gardar en:" Me. Label3. texto = Tamaño do ficheiro: "Me. Label2. Text = velocidade de descarga": "Me. Label4. Texto "End Sub Public Sub ChangeTexts (ByVal lonxitude a distancia, como posición ByVal enteiro, como por cento ByVal Enteiros, ByVal velocidade como double) Me. Label3 =. Text = Tamaño do ficheiro:" & Math. Round ((lonxitude / 1024) , 2) & "KB" Me. Label5. Text = "Download:" & Me txtFileName. Me texto. Label4 .. Text = "Datos" & Math. Round ((posición / 1024), 2) & "KB de" & Math. Round ((lonxitude / 1024), 2) & "KB (" & Me. ProgressBar1. Value & "%)" Se a velocidade = - 1 Me. Label2 continuación. Text = velocidade de descarga ": calcular ..." Me Else. Label2. Text = velocidade de descarga ":" & Math. Round ((velocidade / 1024), 2) & "KB / s" End If Me. ProgressBar1. Value = cento End Sub Private Sub btnDownload_Click (ByVal sendo as Sistema . obxecto, ByVal e As System. EventArgs) Handler btnDownload. Se preme en min. txtFileName. Text <> "" Me AndAlso. txtFileName. texto. StartsWith ("http://") que eu. SaveFileDialog1. filename = Me. txtFileName . texto. Split ("/" c) (Me. txtFileName. texto. Split ("/" c). Lonxitude - 1) Se Me. SaveFileDialog1. ShowDialog = Windows. Forms. DialogResult. OK despois a min. whereToSave = Me. SaveFileDialog1. filename Me. SaveFileDialog1. filename = "" Me. Label6. Text = "Gardar en:" & Me. whereToSave Me. txtFileName. Enabled = False Me. btnDownload. Enabled = False Me. btnCancel. Enabled = True Me. BackgroundWorker1 . RunWorkerAsync () End If Else Iniciar descarga MessageBox. Show ("Por favor, insira URL válida para" descargar "Warning", MessageBoxButtons. OK, MessageBoxIcon. Warning) End If End Sub Private Sub btnCancel_Click (ByVal sendo as System. obxecto, e como System. EventArgs) Handler btnCancel ByVal. Prema en min. BackgroundWorker1. CancelAsync () 'Enviar solicitude cancelar Try Me. bckZip. CancelAsync () Catch ex As Exception' Do Nothing End Try End Sub Private Sub BackgroundWorker1_DoWork (ByVal sendo as System. obxecto, ByVal e As System. ComponentModel. DoWorkEventArgs) Handler BackgroundWorker1. doWork 'Creando a solicitude ea obtención da resposta theResponse Din Din HttpWebResponse theRequest HttpWebRequest Try' verifica se o arquivo existe theRequest = WebRequest. Create (Me. txtFileName. Texto) = theRequest theResponse. theRequest GetResponse. Timeout = 10000000 Catch ex As Exception MessageBox. Show ("Houbo un erro durante a descarga do ficheiro. possibe causas:" & ControlChars. CrLf & _ "1) Arquivo non existe" e ControlChars. CrLf & _ "2) erro no servidor remoto", "Erro", MessageBoxButtons. OK, MessageBoxIcon. Error) cancelDelegate Din Nova DownloadCompleteSafe (AddressOf DownloadComplete) Me. Invoke (cancelDelegate, True) Saír Sub End Try Din lonxitude As Long = theResponse. ContentLength "tamaño da resposta (en bytes) Din safedelegate Como ChangeTextsSafe (AddressOf ChangeTexts) Me. Invoke (safedelegate, lonxitude, 0, 0, 0) 'Chamada TreadsafeDelegate Din WriteStream New FileStream (. Me IO. whereToSave Novo, IO. . Create) Substitución FileMode para Stream.Position (stream WebResponse non buscar apoio) Din nLeia As Enteiros 'Para calcular a velocidade de descarga speedtimer Din Din New Stopwatch currentspeed As Double = - 1 Lecturas Din As Enteiros = 0 Do Se BackgroundWorker1 . CancellationPending then 'Se o usuario sair descarga abortar Do End If speedtimer. Start () Din readBytes (4096) As Byte Din bytesRead As Enteiros = theResponse. GetResponseStream. Read (readBytes, 0, 4096) = + nLeia cento Din bytesRead As Enteiros = (/ lonxitude nLeia) * 100 min. Invoke (safedelegate, lonxitude, nLeia, por cento, currentspeed) Se bytesRead = 0 then exit Do WriteStream. Write (readBytes, 0, bytesRead) speedtimer. Stop () Lecturas + = 1 Se as lecturas> = 5 then 'Para aumentar a precisión, a velocidade se calcula só cada cinco ciclos currentspeed 20.480 = 1000 / (speedtimer. ElapsedMilliseconds / speedtimer). Reset () Lecturas = 0 End If' Pechar a loop dos córregos theResponse. GetResponseStream. Close () WriteStream . Close () Se Me. BackgroundWorker1. CancellationPending Entón IO. Arquivo. Delete (Me. whereToSave) Din cancelDelegate As New DownloadCompleteSafe (AddressOf DownloadComplete) Me. Invoke (cancelDelegate, True) exit sub End If Din completeDelegate As New DownloadCompleteSafe (AddressOf DownloadComplete ) Me. Invoke (completeDelegate, False) End Sub |













































