前面利用HttpWebResponse类,主要是解决获取网页源代码,或者利用它进行一些网页的简单操作。
下面再用一个例子演示下载一个文件。
本来下载很简单,直接用下面一句就完成OK啦 :
My.Computer.Network.DownloadFile("http://www.URLtoDownloadFrom.net", "C:\filename.html")
但这个例子演示,提前获知要下载文件的大小,正在下载时的网速,以及已经下载了多少。程序变量用了不少.
注意:
1、为了简化,没用线程,但容易产生死机错觉,故循环中加入了Application.DoEvents();
2、时间差量(少)需大于等于1,不然,网速无穷大;
3、单位时间下载量,每次计算完成后重新置0;
4、用的是文本框显示状态,每次刷新会有闪烁现象。
先看一下程序效果:
Imports System.IO Imports System.Net Public Class Form1 Private Sub btnDown_Click(sender As Object, e As EventArgs) Handles btnDown.Click Dim hwq As HttpWebRequest Dim hwp As HttpWebResponse Dim colHeader As WebHeaderCollection '响应头信息集合 Dim lngSize As Int64 '要下载文件的总大小 Dim lngCurSize As Int64 '已经下载大小 Dim lngNet As Int64 '计算网速用 Dim stRespones As Stream '响应流 Dim st As FileStream '本地流 Dim intCurSize As Int64 Dim bytBuffer(512) As Byte '缓存大小 Dim datLast As DateTime '最后一次时间 Dim intDiff As Int32 '两次时间差(秒) datLast = Now '取得开始时间 hwq = CType(HttpWebRequest.Create(txtAddress.Text), HttpWebRequest) '请求对象创建 hwp = hwq.GetResponse '取得响应对象 colHeader = hwp.Headers '取得响应头 lngSize = colHeader.Get("Content-Length") '取得要下载文件的大小 stRespones = hwp.GetResponseStream '取得响应流 st = New FileStream("D:\2.zip", FileMode.Create) '本地保存文件 intCurSize = stRespones.Read(bytBuffer, 0, bytBuffer.Length) '响应流中读取 Do While (intCurSize > 0) '只要有数据就继续 st.Write(bytBuffer, 0, intCurSize) '写入本地文件 intDiff = DateDiff(DateInterval.Second, datLast, Now) lngCurSize = lngCurSize + intCurSize lngNet = lngNet + intCurSize '单位时间内的下载量 If intDiff >= 1 Then txtState.Text = "文件大小:" & lngSize & vbCrLf & "已经下载:" & lngCurSize & vbCrLf & "下载速度:" & CInt(lngNet / intDiff / 1024) & "k/s" datLast = Now lngNet = 0 End If Application.DoEvents() intCurSize = stRespones.Read(bytBuffer, 0, bytBuffer.Length) '继续读取 Loop txtState.Text = "下载完成!" st.Close() stRespones.Close() End Sub End Class