C#下载文件——WebClient
这两天在试着做自动升级程序,用到了WebClient
简单把我的过程讲讲
为了配合显示进度
先画个2个PrograssBar
一个命名为progbar_single一个为progbar_total
然后在写一个下载文件方法
private void doDownload(string fileName)
{
lbl_singleFileName.Text = "正在下载:"+fileName;//label框提示下载文件
progbar_single.Value=0;//初始化单个文件下载条
WebClient ws = new WebClient();
ws.DownloadProgressChanged += new DownloadProgressChangedEventHandler(OnDownloadProgressChanged);
//绑定下载事件,以便于显示当前进度
ws.DownloadFileCompleted += new AsyncCompletedEventHandler(OnDownloadFileCompleted);
//绑定下载完成事件,以便于计算总进度
ws.DownloadFileAsync(new Uri(upapp.UpdateURL + fileName), Path.Combine(AppDomain.CurrentDomain.BaseDirectory+"Temp", fileName));
//调用DownloadFileAsync方法下载文件
//DownloadFileAsync有2个重载,另一个我没搞明白最后一个参数该传什么,有哪位朋友知道的,请留言告诉我谢谢
//upapp是我一个实体类,UpdateURL存放了下载的地址(值为http://harde.org/SoftUpdate/)
//Path.Combine()是一个用来连接地址的方法,我将在另一日志中详细对其介绍
}
///
///
///
///
private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//在网上看到有朋友这么来控制进度条,我觉得麻烦,毕竟有省事的为什么我要麻烦一番……
//this.SetProcessBar(e.ProgressPercentage, (int)((nDownloadedTotal + e.BytesReceived) * 100 / total));
progbar_single.Value = e.ProgressPercentage;
lbl_singleInfo.Text = "已下载" + e.BytesReceived + "字节/总计" + e.TotalBytesToReceive + "字节";//一个label框,用来显示当前下载的数据
}
///
///
///
///
private void OnDownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("complied!");//计算总下载进度,因为我在服务端XML文件里可以得到文件大小,所以我直接用服务端数据,我回头再看看有没有什么好办法
}[/csharp” escaped=”true” line=”1]
下载文件部分到这里就可以结束了
不过为了方便,我使用了一个数组用来存放下载文件列表
ArrayList downloadFileList;[/csharp” line=”1]
写个循环
foreach (string fileName in updateFiles_N)
{
doDownload(fileName);//下载文件
}[/csharp” line=”1]
这样就可以批量下载了,现在时单线程下载
大家可以运用上多线程同时下载多个文件。大家可以参考我的另一篇日志
另外,为了给与更好的用户体验,大家可以在显示下载的地方把字节转换成KB、MB(因为harde是用来做程序更新的,所以单个文件都不会很大,因此只替换到MB、大家有需要可以自己写个GB的)
if ((e.BytesReceived / 1024) > 1024)
{
received = (e.BytesReceived / 1024) / 1024 + "MB";
}
else
{
received = e.BytesReceived / 1024 + "KB";
}
if (((e.TotalBytesToReceive / 1024) > 1024) && isCalculated)
{
total = (e.TotalBytesToReceive / 1024) / 1024 + "MB";
isCalculated = true;
}
else
{
total = e.TotalBytesToReceive / 1024 + "KB";
isCalculated = true;
}[/csharp” line=”1″ escaped=”true]
同时把显示的地方更改下
lbl_singleInfo.Text = "已下载" + received + "/总计" + total;[/csharp” line=”1″ escaped=”true]