在C# winform编程中,有一个进度条的控件叫 ProgressBar,可以通过代码设置它的属性,然后我们就可以实现下载的时候显示进度条。
对于文件夹的下载,由于文件夹里面可能存在文件和文件夹,而C#仅支持对文件的下载,所以需要通过递归搜索,遍历文件夹的方式进行下载。
public void Download(string savePath, string sourcePath)
{
if (!File.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
string[] dirs = Directory.GetDirectories(sourcePath);
string[] files = Directory.Files(sourcePath);
if (files.Length > 0)
{
for (int i = 0; i < files.Length; i++)
{
WebClient client = new WebClient();
// 绑定事件
client.DownloadProgressChanged += client_DownloadProcessChanged;
// 异步下载
client,DOwnloadFileAsync(new Uri(sourcePath + "\\" + Path.GetFileName(files[i]), savePath + "\\" + Path.GetFileName(fles[i])));
Application.DoEvents();
Thread.Sleep(200);
}
}
if (dirs.Length > 0)
{
for (int j = 0; j < dirs.Length; j++)
{
// 递归调用
Download(savePath + "\\" + Path.GetFileName(dirs[j]), sourcePath + "\\" + Path.GetFileName(dirs[j]));
}
}
}
private void client_DownloadProcessChanged(object sender, DownloadProcessChangedEventArgs e)
{
this.processBar.Minimum = 0;
this.processBar.Maximum = (int)e.TotalBytesToReceive;
this.processBar.Value = (int)e.BytesReceived;
this.label.Text = "当前正在下载" + e.ProgressPercentage + "%";
}
使用异步下载是因为,在下载文件的时候,有一个事件对progressBar进行操作,这个progressBar是唯一的,假如有多个下载同时对其进行操作,就会导致程序出bug。因此采用异步下载的方式,进行200毫秒的休眠时为了让它缓冲一下。。。。(也许吧,不加这个休眠下载有点时候出现下载不完全的问题)
然后有一个绑定时间的操作,可以再下载状态改变的时候,进行百分比计算
本文介绍了如何在C# Winform应用中,利用ProgressBar控件显示文件夹下载的进度。由于C#只能下载文件,所以需要递归遍历文件夹并异步下载。在下载过程中,通过事件更新进度条,并且为了防止多线程冲突,采用200毫秒的休眠来确保进度条正确显示。同时,还提到了如何根据下载状态计算百分比。

844

被折叠的 条评论
为什么被折叠?



