这两天在试着做自动升级程序,用到了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://www.harde.com.cn/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文件里可以得到文件大小,所以我直接用服务端数据,我回头再看看有没有什么好办法 }
下载文件部分到这里就可以结束了
不过为了方便,我使用了一个数组用来存放下载文件列表
这样就可以批量下载了,现在时单线程下载
大家可以运用上多线程同时下载多个文件。大家可以参考我的另一篇日志
另外,为了给与更好的用户体验,大家可以在显示下载的地方把字节转换成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; }
同时把显示的地方更改下
lbl_singleInfo.Text = "已下载" + received + "/总计" + total;