【发布时间】:2015-08-28 11:22:26
【问题描述】:
【问题讨论】:
-
见this。但显然,这种方法很慢,因为它可能会下载整个文件以获得它的大小......
-
为您提供了一个新的、干净的代码,用于检索下载文件的大小无需先下载! :)
标签: vb.net download webbrowser-control
【问题讨论】:
标签: vb.net download webbrowser-control
我做了一些研究,这可能是获取下载大小(以字节为单位)的最简单和“最干净”的方法:
Public Function GetDownloadSize(ByVal URL As String) As Long
Dim r As Net.WebRequest = Net.WebRequest.Create(URL)
r.Method = Net.WebRequestMethods.Http.Head
Using rsp = r.GetResponse()
Return rsp.ContentLength
End Using
End Function
感谢Reed Kimble,他让我在my initial MSDN question 中处理WebResponse。
上面的代码将读取文件的响应头,而不是读取它的正文。这意味着文件不需要下载,只是为了检查它的大小。
这就是为什么某些代码首先需要实际下载文件的原因;他们正在读取文件的正文而不是标题。
希望这会有所帮助!
【讨论】:
使用WebClient ResponseHeaders:
Public Shared Function GetFileSize(url As String) As Long
Using obj As New WebClient()
Using s As Stream = obj.OpenRead(url)
Return Long.Parse(obj.ResponseHeaders("Content-Length").ToString())
End Using
End Using
End Function
【讨论】:
WebClient 的 DownloadProgressChanged 事件的参数包含属性 TotalBytesToRecieve。这会告诉您正在下载的文件有多少字节。
不是最漂亮的方法,但如果您想在下载之前获得文件的大小,您可以开始下载文件然后立即取消它:
Dim DownloadSize As Long
Private Sub CheckDownloadSize(ByVal URL As String)
WebClient.DownloadFile(URL, IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Temp, "tempdownload.tmp"))
End Sub
Private WithEvents WebClient As New WebClient
Private Sub WebClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient.DownloadProgressChanged
DownloadSize = e.TotalBytesToReceive
WebClient.CancelAsync()
End Sub
否则,只需删除 .CancelAsync() 行。
【讨论】:
RemoveHandler WebClient.DownloadProgressChanged, AddressOf WebClient_DownloadProgressChanged