在VB中下载文件之前获取文件大小

3

我一直在使用Visual Basic开发一个Web浏览器。现在,我想在下载文件之前获取文件大小,并在单击下载时获取已下载MB数(请查看图片)。

..

感谢您的帮助!


1
请参考这个链接。但是显然,这种方法很慢,因为它可能会下载整个文件以获取其大小... - Drarig29
给你一个新的、干净的代码,可以获取下载文件的大小,而无需先下载它! :) - Visual Vincent
3个回答

7

我做了一些研究,以下可能是获取下载大小(以字节为单位)最简单和“最干净”的方法:

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的建议,在我的初始MSDN问题中告诉我要处理WebResponse


上述代码将读取文件的响应头,而不是读取其正文。这意味着文件无需下载即可检查其大小。

这就是为什么有些代码需要首先下载文件;它们读取文件的正文而不是其头部。


希望这可以帮助您!


6

使用 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

在下载文件之前请求文件大小


1
问题在于,为了获取文件大小,整个文件都需要下载。因此速度很慢。让我们看看原帖作者是否会喜欢它。 - Drarig29
1
正如#Drarig29所说,要获取文件大小必须下载整个文件。因此,在文件下载过程中无法获取已下载的兆字节数。但是感谢您的回答。 - Technologuy
1
而且...它确定在获取文件大小之前下载整个文件吗? - Technologuy
@TechTechnology 从我所了解的来看,没有人真正确定那个问题的答案,你应该尝试一下。(顺便说一句,引用别人时请使用“@”而不是“#”) - Drarig29

4
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()这一行即可。

2
@TechTechnology:这并不是下载整个文件,而只是其中的几KB。 - Visual Vincent
@sunilkarkala:很高兴听到这个消息!但是,如果你只是想获取下载大小而不实际下载它,我建议你使用我的另一个答案。但选择权在你手中。 :) - Visual Vincent
@sunilkarkala:尽管如此,我的另一个答案(被接受的那个)是最好的选择,所以我不明白为什么你要使用这个答案。;) - Visual Vincent
实际上,我一直在使用Web客户端进行工作,所以我想继续使用它,如果你建议这是最好的方法,那么我会尝试一下,谢谢。 - sunilkarkala
@sunilkarkala :我不知道其他的方法。但是[这里有一个问题](http://stackoverflow.com/questions/25789921/downloading-a-file-in-multiple-chunks)关于分段下载文件的问题,也许代码可以帮助到你。 - Visual Vincent
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接