添加报告下载的进度条(包含源代码)



编程新手,在这里我被困在我要放代码的地方,让进度条报告下载的进度&写入文件。

源代码将下载一个100mb的文件,分为6部分,我想要2个进度条,1个标签,它将报告的进度

  1. 下载进度
  2. 写入文件(如果可能,还是已经是多余的?(
  3. 进度为downloaded_MB/MaxFileSize_MB的标签
  4. 如何使文件下载速度更快?添加分区会让它更快吗(我对此表示怀疑(

代码如下。

Imports System.IO
Imports System.Net
Imports System.Threading
Public Class Form1
Dim efsize, fsize
Public Class FileDownloader
Public Start As Integer
Public Count As Integer
Public PathTemp As String
Public Url As String
Public Sub New(ByVal url As String, ByVal start As Integer, ByVal count As Integer)
Me.Url = url
Me.Start = start
Me.Count = count
End Sub
End Class
Public Shared Function FormatFileSize(ByVal Size As Long) As String
Try
Dim KB As Integer = 1024
Dim MB As Integer = KB * KB
' Return size of file in kilobytes.
If Size < KB Then
Return (Size.ToString("D") & " bytes")
Else
Select Case Size / KB
Case Is < 1000
Return (Size / KB).ToString("N") & " KB"
Case Is < 1000000
Return (Size / MB).ToString("N") & " MB"
Case Is < 10000000
Return (Size / MB / KB).ToString("N") & " GB"
End Select
End If
Catch ex As Exception
Return Size.ToString
End Try
End Function
Private Sub startDownload()
ServicePointManager.Expect100Continue = True
System.Net.ServicePointManager.DefaultConnectionLimit = 1000
Dim url As String = "https://speed.hetzner.de/100MB.bin"
Dim filewonloadersList As List(Of FileDownloader) = New List(Of FileDownloader)()
Dim req As Net.WebRequest = Net.WebRequest.Create(url)
Dim response = req.GetResponse()
req.Method = "HEAD"
Dim resp As Net.WebResponse = req.GetResponse()
Dim responseLength As Integer = Integer.Parse(resp.Headers.Get("Content-Length"))
Dim parts As Integer = 6
Dim eachSize = responseLength / parts
Dim lastPartSize = eachSize + responseLength Mod parts
For i As Integer = 0 To parts - 1 - 1
filewonloadersList.Add(New FileDownloader(url, i * eachSize, eachSize))
Next
filewonloadersList.Add(New FileDownloader(url, (parts - 1) * eachSize, lastPartSize))
Dim threads = New List(Of Thread)()
For Each item In filewonloadersList
Task.WhenAll(DoDownload(item))
Next
End Sub
Public Async Function DoDownload(ByVal data As Object) As Task
retry:
Try
ServicePointManager.Expect100Continue = True
System.Net.ServicePointManager.DefaultConnectionLimit = 1000
Dim downloader = TryCast(data, FileDownloader)
Dim req As HttpWebRequest = CType(WebRequest.Create(downloader.Url), HttpWebRequest)
req.AddRange(downloader.Start, downloader.Start + downloader.Count - 1) 'downloader.Start + downloader.Count - 1
Dim response = Await req.GetResponseAsync()
Using reponseStream = response.GetResponseStream()

Using fs = New FileStream($"temp_{downloader.Start}.sth", FileMode.OpenOrCreate)
Dim buffer = New Byte(1023) {}
Dim bytesRead As Integer = 0
Do
bytesRead = Await reponseStream.ReadAsync(buffer, 0, 1024)
progMain.Value = fs.Length
Await fs.WriteAsync(buffer, 0, bytesRead)
Await fs.FlushAsync()
Loop While bytesRead > 0
fs.Close()
efsize = FormatFileSize(Convert.ToInt64(bytesRead))
End Using
End Using
Catch e As Exception
GoTo retry
End Try
End Function

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
startDownload()
End Sub

End Class

我把它贴在这里作为最后的手段,因为我不知道下一步该做什么。

还请给我指一个正确的方向,在哪里或做什么,这样我就可以在探索编程的同时学到更多。

我选择了VB.net,因为我可以很容易地关注它,而且对新手非常友好。

谢谢!

如果您的表单中有一个ProgressBar(比如ProgressBar1(,您可以简单地在每次出现"进步;在您的代码中。

例如,通常当你有一个循环时,你可以报告它:

ProgressBar1.MaxValue = 12
For i as Integer = 0 to 12
'... some code
ProgressBar1.Value = i
Application.DoEvents()   'will update the UI
Next

然后ProgressBar可以显示完成的量百分比。

一般情况下,最好使用正确的多线程原则,但正如你所提到的,你还是有点新的,正在通过自己的方式学习。

无关建议:最好永远不要使用GoTo(完全(

最新更新