Last ned fil beregne fart og fremdrift-bakgrunn Worker og Progress bar

13 februar 2009 av AcidRaZor · igjen en kommentar
Arkivert under: . NET , Programmering 101

Her er noen kode som vil gjøre bruk av VB.NET 's Backgroundworker klasse og starte en web forespørsel om å laste ned en fil. Det vil beregne filens hastighet samt indikerer det er fremgang på en fremdriftslinje. Alle samtidig hovedskjemaet tilgjengelig.

  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 Dim whereToSave Som String 'Hvor programmet lagre filen Delegat Sub ChangeTextsSafe (ByVal lengde As Long, ByVal stilling som Integer, ByVal prosent As Integer, ByVal hastighet som dobbeltrom) delegat Sub DownloadCompleteSafe (ByVal avbestilling Som Boolean) Public Sub DownloadComplete (ByVal kansellert Som Boolean) Me. txtFileName. Enabled = True meg. btnDownload. Enabled = True meg. btnCancel. Enabled = False Ved avbestilling så meg. Label4. Text = "Avlyst" 'MessageBox.Show ("Last ned avbrutt", "Avbrutt", MessageBoxButtons.OK, MessageBoxIcon.Information) Else Me. Label4. Text = "lastet ned" 'MessageBox.Show ("Vellykket lastet ned!", "All OK", MessageBoxButtons.OK, MessageBoxIcon.Information) End If Me. ProgressBar1. Valuta = 0 Me. Label5. Text = "Laster ned:" Me. Label6. Text = "Lagre i:" Me. Label3. Text = "Filstørrelse:" Me. Label2. Text = "Last ned hastighet:" Me. Label4. Tekst = "" End Sub Sub Public ChangeTexts (ByVal lengde As Long, ByVal stilling som Integer, ByVal prosent As Integer, ByVal hastighet som dobbeltrom) Me. Label3. Text = "Filstørrelse:" & Math. Round ((lengde / 1024) , 2) & "kB" Me. Label5. Text = "Laster ned:" & Me. txtFileName. Tekst meg. Label4. Text = "Lastet ned" og Math. Round ((posisjon / 1024), 2) & "KB" og Math. Round ((lengde / 1024), 2) og "KB (" & Me. ProgressBar1. Value & "%)" Hvis hastighet = - 1. Da Me. Label2. Text = "Last ned hastighet: beregningen ..." Else Me. Label2. Text = "Last ned hastighet:" & Math. Round ((speed / 1024), 2) og "KB / s" End If Me. ProgressBar1. Verdi = prosent End Sub Private Sub btnDownload_Click (ByVal avsenderen som system . Objekt, ByVal e Som System. EventArgs) Håndtak btnDownload. Klikk Hvis Me. txtFileName. Text <> "" AndAlso Me. txtFileName. Text. startswith ("http://") så meg. SaveFileDialog1. Filnavn = Meg. txtFileName . Tekst. Split ("/" c) (Me. txtFileName. Text. Split ("/" c). Lengde - 1) Hvis Me. SaveFileDialog1. ShowDialog = Windows. Forms. DialogResult. OK så meg. whereToSave = Meg. SaveFileDialog1. Filnavn meg. SaveFileDialog1. Filnavn = "" Me. Label6. Text = "Lagre i:" & Me. whereToSave meg. txtFileName. Enabled = False meg. btnDownload. Enabled = False meg. btnCancel. Enabled = True meg. BackgroundWorker1 . RunWorkerAsync () 'Start nedlasting End Hvis Else MessageBox. Show ("Vennligst skriv inn gyldig URL for nedlasting", "Warning", MessageBoxButtons. OK, MessageBoxIcon. Advarsel) End If End Sub Private Sub btnCancel_Click (ByVal avsenderen som system. objekt, ByVal e Som System. EventArgs) Håndtak btnCancel. Klikk meg. BackgroundWorker1. CancelAsync () 'Send avbryte forespørselen Prøv meg. bckZip. CancelAsync () Catch ex Som unntak "Do Nothing End Prøv End Sub Private Sub BackgroundWorker1_DoWork (ByVal avsenderen som system. Objekt, ByVal e Som System. ComponentModel. DoWorkEventArgs) BackgroundWorker1 Håndtak. DoWork 'Oppretter forespørselen og få svar Dim theResponse Som HttpWebResponse Dim theRequest Som HttpWebRequest Prøv' Sjekker om filen eksisterer theRequest = WebRequest. Lag (Me. txtFileName. Tekst) theResponse = theRequest. GetResponse theRequest. Timeout = 10000000 Catch ex Som unntak MessageBox. Show ("En feil oppstod under nedlasting av fil. Possibe årsaker:" & ControlChars. CRLF & _ "1) Filen finnes ikke" & ControlChars. CRLF & _ "2) ekstern server error", "Feil", MessageBoxButtons. OK, MessageBoxIcon. Feil) Dim cancelDelegate som ny DownloadCompleteSafe (AddressOf DownloadComplete) Me. Invoke (cancelDelegate, sann) Exit Sub End Prøv Dim lengde As Long = theResponse. ContentLength "Størrelsen på respons (i bytes) Dim safedelegate som ny ChangeTextsSafe (AddressOf ChangeTexts) Me. Invoke (safedelegate, lengde, 0, 0, 0) 'påberope seg TreadsafeDelegate Dim writeStream som ny IO. FileStream (Me. whereToSave, IO. FileMode. Lag) 'Erstatt Stream.Position (webResponse strømmen støtter ikke søker) Dim nRead As Integer' For å beregne nedlastingshastigheten Dim speedtimer som ny Stoppeklokke Dim currentspeed Som Double = - 1 Dim opplesninger As Integer = 0 Vil Dersom BackgroundWorker1 . CancellationPending Then 'Hvis brukeren avbryte nedlastingen Exit Do End If speedtimer. Start () Dim readBytes (4096) Som Byte Dim bytesread As Integer = theResponse. GetResponseStream. Les (readBytes, 0, 4096) nRead + = bytesread Dim prosent As Integer = (nRead / lengde) * 100 Me. Invoke (safedelegate, lengde, nRead, prosent, currentspeed) Hvis bytesread = 0 Then Exit Do writeStream. Write (readBytes, 0, bytesread) speedtimer. Stop () opplesninger + = 1 Hvis målinger> = 5 Then 'For økt presisjon, hastigheten er det beregnes bare hvert femte cicles currentspeed = 20480 / (speedtimer. ElapsedMilliseconds / 1000) speedtimer. Reset () opplesninger = 0 End If Loop "Lukk strømmer theResponse. GetResponseStream. Close () writeStream . Close () Hvis Me. BackgroundWorker1. CancellationPending  IO. File. Slett (Me. whereToSave) Dim cancelDelegate som ny DownloadCompleteSafe (AddressOf DownloadComplete) Me. Invoke (cancelDelegate, sann) Exit Sub End If Dim completeDelegate som ny DownloadCompleteSafe (AddressOf DownloadComplete ) Me. Invoke (completeDelegate, False) End Sub 

SEO Drevet av Platinum SEO fra Techblissonline