我在其他网站上看到过这个问题,但是给出的答案总是给我带来某种例外,所以我会用自己的代码问自己。
我正在尝试创建一个程序来下载文件并显示进度条。
我的代码到目前为止
Private Sub AdwCleanerButton_Click(sender As Object, e As EventArgs) Handles AdwCleanerButton.Click
My.Computer.Network.DownloadFile(
"https://www.dropbox.com/s/gg3ocih2dv3t3lg/adwcleaner_6.020.exe?dl=0",
"C:\Users\llexl\Desktop\adwcleaner_6.020.exe")
End Sub
我想将下载百分比显示在进度条上。
答案 0 :(得分:2)
使用最少的代码执行此操作的最简单方法是使用DownloadFile的内置进度条,它将显示自己的小窗口,其中包含进度条和取消按钮。您必须在代码中添加以下参数:
My.Computer.Network.DownloadFile("https://www.dropbox.com/s/gg3ocih2dv3t3lg/adwcleaner_6.020.exe?dl=0", _
"C:\Users\llexl\Desktop\adwcleaner_6.020.exe", "", "", True, 500, True)
在目标文件路径之后看到的第一个True是创建进度条窗口的参数。
但是,如果要查询文件的总大小并在整个下载过程中获得进度以实现自己的进度条,则该过程会变得更复杂一些。您必须创建一个事件处理程序来处理下载的进度更改事件,然后将进度中收到的字节数转换为百分比并将该百分比应用于您的进度条...然后,您的下载代码如下:
Dim url As String = "https://www.dropbox.com/s/gg3ocih2dv3t3lg/adwcleaner_6.020.exe?dl=0"
Dim savePath As String = "C:\Users\llexl\Desktop\adwcleaner_6.020.exe"
Dim download As New WebClient()
AddHandler download.DownloadProgressChanged, AddressOf Download_ProgressChanged
download.DownloadFileAsync(New Uri(url), savePath)
你的进步改变了处理程序:
Public Sub Download_ProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
Try
ProgressBar1.Value = CInt(Math.Round((e.BytesReceived / e.TotalBytesToReceive) * 100, 0, MidpointRounding.AwayFromZero))
Catch ex As Exception
Debug.Print(ex.ToString)
End Try
End Sub
但是,您是否可以从downloadprogress对象获取文件的总大小取决于文件头中的数据,因此始终不会返回该文件的数字。您可能需要在下载之前查找备用函数以获取文件的大小,以便在进度百分比计算中使用。我相信dropbox有一个可用于获取该类型信息的API