C#下载文件——WebClient

作者: harde 分类: DotNet 发布时间: 2009-05-02 18:21

这两天在试着做自动升级程序,用到了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]

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注