【问题标题】:Get file size before download it in vb在vb中下载之前获取文件大小
【发布时间】:2015-08-28 11:22:26
【问题描述】:

我一直在使用 Visual Basic 中的网络浏览器..现在,我想做的是在下载之前获取文件大小,当我点击下载时,我想获取已经下载的 Mbs 的数量(看图)

感谢您的帮助!

【问题讨论】:

  • this。但显然,这种方法很慢,因为它可能会下载整个文件以获得它的大小......
  • 为您提供了一个新的、干净的代码,用于检索下载文件的大小无需先下载! :)

标签: vb.net download webbrowser-control


【解决方案1】:

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

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


上面的代码将读取文件的响应头,而不是读取它的正文。这意味着文件不需要下载,只是为了检查它的大小。

这就是为什么某些代码首先需要实际下载文件的原因;他们正在读取文件的正文而不是标题。


希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    Request file size before download it

    【讨论】:

    • 这个问题是下载整个文件以获得它的大小。所以它很慢。让我们看看OP是否会喜欢它。
    • 正如#Drarig29 所说,下载整个文件以获取其大小..所以,在下载文件时我无法获取已下载的 Mbs 数.. 但感谢您的回答..
    • 而且.. 确定它会在获得文件大小之前下载整个文件吗?
    • @Technology 从我所读到的所有内容中,没有人真正确定这一点,您应该尝试一下。 (顺便说一句,引用某人时使用“@”而不是“#”)
    【解决方案3】:

    WebClientDownloadProgressChanged 事件的参数包含属性 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() 行。

    【讨论】:

    • @Technology :这不会下载整个文件,但可能只有几 KB。
    • @sunilkarkala :很高兴听到这个消息!但是,如果您使用此 only 来获取下载大小但尚未实际下载它,我推荐我的其他答案。但选择权在你。 :)
    • 我试过上面的代码,但是事件进度改变事件调用了四到五次,即使在调用 WebClient.CancelAsync() 之后,你能告诉我为什么会这样,是 webclient 需要时间来关闭该异步调用。
    • @sunilkarkala :不知道,但您可以从自身中删除事件处理程序。把这个放在 CancelAsync 之后:RemoveHandler WebClient.DownloadProgressChanged, AddressOf WebClient_DownloadProgressChanged
    • @sunilkarkala :尽管如此,我的另一个答案(已接受的答案)是最好的方法,所以我不明白您为什么要使用这个答案。 ;)
    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多