`
bolutes
  • 浏览: 868715 次
文章分类
社区版块
存档分类
最新评论

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://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;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics