在C#网络编程中,一般都用WebClient类和FileStream类进行文件下载操作,有时可能需要显示下载的实时速度,而这两个类没有提供相关方法,是不是就不能实现了呢,很明显可以实现。俗话说自己动手丰衣足食,下面咱就开始动手吧~ |
首先,在下载文件的时候,我们不用DownloadFile()方法进行下载,用WebResponse的GetResponseStream()流进行下载,设一个临时储存变量用来保存不断接收的数据。再用一个额外的独立计时器来分别根据时间间隔和临时收到数据量做计算,临时数据接收量在速度计算后会清空。
下面开始代码:
string FileTemp=null; //临时储存
private const int SPD_INTERVAL_SEC = 1; //时间常量
Stream stream = rps.GetResponseStream(); //获取服务器响应文件流
byte[] byts = new byte[rps.ContentLength]; //创建字节数组保存文件流
System.Threading.Timer FileTm = new System.Threading.Timer(SpeedTimer, null, 0, SPD_INTERVAL_SEC*1000);//使用回调函数,每SPD_INTERVAL_SEC秒执行一次
while ((count = stream.Read(byts, 0, 5000)) != 0)
{
FileTemp += count; //临时储存长度
strTemp += count; //获取已下载文件长度
}
///
///回调方法
///
private void SpeedTimer(object state)
{
FileSpeed = FileTemp/SPD_INTERVAL_SEC; //SPD_INTERVAL_SEC秒下载字节数,
FileTemp = 0; //清空临时储存
}
整个文件流全部保存在byts字节数组中,可以在循环时,边读边写入。
效果图: