如何使用进度条进行下载
how to use progressbar for process of downloading
我想在我的 windows 表单应用程序中使用进度条。该应用程序将用于将文件从一个目录下载到另一个目录。
但是当用户点击下载按钮时,应用程序似乎什么都不做。所以我想用进度条向用户展示下载过程。
我确实搜索了进度条,但找不到 "how to use progress bar for process of downloading" 的答案。
如果有人向我解释如何使用进度条进行下载,我将非常高兴。
WebClient
有一个 DownloadProgressChanged
-事件。将它连接到进度条,你就可以开始了。 MSDN
备注:您需要使用 DownloadDataAsync
、DownloadFileAsync
或 OpenReadAsync
才能触发 DownloadProgressChanged
-Event。
您可以使用 DownloadFileAsync 下载文件而不阻塞主线程,并设置事件处理程序以在栏中显示进度:
private void button1_Click(object sender, EventArgs e)
{
WebClient webClient = new WebClient();
string sourceFile = @"\server\test.txt";
string destFile = @"\server2\test2.txt";
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri(sourceFile), destFile);
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("The download is completed!");
}
或者另一种方法可以使用将 属性 WorkerReportsProgress 设置为 true 的 BackgroundWorker。那么你应该订阅事件 DoWork 和 ProgressChanged:在 DoWork 方法中,你将下载或传输文件的代码放在一个单独的线程上,并计算工作进度。在 ProgressChanged 方法中,只需更新进度条值。在这种情况下,您的代码将如下所示:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// the path of the source file
string sourceFile = @"\shared\test.txt";
// the path to write the file to
string destFile = @"\shared2\test2.txt";
FileInfo info = new FileInfo(sourceFile);
// gets the size of the file in bytes
Int64 size = info.Length;
// keeps track of the total bytes downloaded so you can update the progress bar
Int64 runningByteTotal = 0;
using (FileStream reader = new FileStream(sourceFile, FileMode.Open, FileAccess.Read))
{
using (Stream writer = new FileStream(destFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
int iByteSize = 0;
byte[] byteBuffer = new byte[size];
while ((iByteSize = reader.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
// write the bytes to the file
writer.Write(byteBuffer, 0, iByteSize);
runningByteTotal += iByteSize;
// calculate the progress
double index = (double)(runningByteTotal);
double total = (double)byteBuffer.Length;
double progressPercentage = (index / total);
int iProgressPercentage = (int)(progressPercentage * 100);
// update the progress bar
backgroundWorker1.ReportProgress(iProgressPercentage);
}
// clean up the file stream
writer.Close();
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
在触发文件下载的按钮单击事件(或其他事件)中,您应该添加此代码以异步启动后台工作程序运行:
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
我想在我的 windows 表单应用程序中使用进度条。该应用程序将用于将文件从一个目录下载到另一个目录。
但是当用户点击下载按钮时,应用程序似乎什么都不做。所以我想用进度条向用户展示下载过程。
我确实搜索了进度条,但找不到 "how to use progress bar for process of downloading" 的答案。
如果有人向我解释如何使用进度条进行下载,我将非常高兴。
WebClient
有一个 DownloadProgressChanged
-事件。将它连接到进度条,你就可以开始了。 MSDN
备注:您需要使用 DownloadDataAsync
、DownloadFileAsync
或 OpenReadAsync
才能触发 DownloadProgressChanged
-Event。
您可以使用 DownloadFileAsync 下载文件而不阻塞主线程,并设置事件处理程序以在栏中显示进度:
private void button1_Click(object sender, EventArgs e)
{
WebClient webClient = new WebClient();
string sourceFile = @"\server\test.txt";
string destFile = @"\server2\test2.txt";
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri(sourceFile), destFile);
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("The download is completed!");
}
或者另一种方法可以使用将 属性 WorkerReportsProgress 设置为 true 的 BackgroundWorker。那么你应该订阅事件 DoWork 和 ProgressChanged:在 DoWork 方法中,你将下载或传输文件的代码放在一个单独的线程上,并计算工作进度。在 ProgressChanged 方法中,只需更新进度条值。在这种情况下,您的代码将如下所示:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// the path of the source file
string sourceFile = @"\shared\test.txt";
// the path to write the file to
string destFile = @"\shared2\test2.txt";
FileInfo info = new FileInfo(sourceFile);
// gets the size of the file in bytes
Int64 size = info.Length;
// keeps track of the total bytes downloaded so you can update the progress bar
Int64 runningByteTotal = 0;
using (FileStream reader = new FileStream(sourceFile, FileMode.Open, FileAccess.Read))
{
using (Stream writer = new FileStream(destFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
int iByteSize = 0;
byte[] byteBuffer = new byte[size];
while ((iByteSize = reader.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
// write the bytes to the file
writer.Write(byteBuffer, 0, iByteSize);
runningByteTotal += iByteSize;
// calculate the progress
double index = (double)(runningByteTotal);
double total = (double)byteBuffer.Length;
double progressPercentage = (index / total);
int iProgressPercentage = (int)(progressPercentage * 100);
// update the progress bar
backgroundWorker1.ReportProgress(iProgressPercentage);
}
// clean up the file stream
writer.Close();
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
在触发文件下载的按钮单击事件(或其他事件)中,您应该添加此代码以异步启动后台工作程序运行:
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}