让我为你讲解一下“C# Winform下载文件并显示进度条的实现代码”的完整攻略。
准备工作
在开始编写代码实现下载文件并显示进度条之前,需要先获取待下载的文件URL和存储路径,同时还需要对Winform中的ProgressBar控件有所了解。
实现方式
一般来说,实现下载文件并显示进度条有两种方式:一是使用WebClient对象,二是使用HttpWebRequest对象。不过这两种方式都需要通过多线程来实现,否则会影响GUI线程,导致界面卡死。
方法一:使用WebClient对象实现下载
在此方法中,我们需要先定义一个WebClient对象,然后通过它的DownloadFileAsync方法开始异步下载文件。在下载过程中,我们需要通过DownloadProgressChanged事件实时获取下载进度,并在事件处理程序中更新ProgressBar控件。最后,我们需要在DownloadFileCompleted事件中添加下载完成的处理代码。
以下是一个基于WebClient对象的示例代码:
private void DownloadFile(string url, string filepath)
{
try
{
using (var client = new WebClient())
{
client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
client.DownloadFileAsync(new Uri(url), filepath);
}
}
catch (Exception ex)
{
//处理异常
}
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
//下载完成后的处理
}
private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//更新ProgressBar控件
}
方法二:使用HttpWebRequest对象实现下载
在此方法中,我们需要通过HttpWebRequest对象创建一个Http请求,然后通过异步的方式获取文件流并下载。在下载的过程中,我们同样需要通过DownloadProgressChanged事件获取下载进度,并在事件处理程序中更新ProgressBar控件。最后,我们需要在DownloadDataCompleted事件中添加下载完成的处理代码。
以下是一个基于HttpWebRequest对象的示例代码:
private void DownloadFile(string url, string filepath)
{
try
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.BeginGetResponse((result) =>
{
try
{
var response = (HttpWebResponse)request.EndGetResponse(result);
using (var stream = response.GetResponseStream())
using (var fileStream = new FileStream(filepath, FileMode.CreateNew))
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
}
}
this.BeginInvoke((Action)(() =>
{
//下载完成后的处理代码
}));
}
catch (Exception ex)
{
//处理异常
}
}, null);
}
catch (Exception ex)
{
//处理异常
}
}
private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//更新ProgressBar控件
}
示例说明
以下是一个基于WebClient对象的示例。假设我们需要下载一个文件,其URL为:http://example.com/download/1.zip。下载完成后,我们需要显示下载完成的消息。
private void btnDownload_Click(object sender, EventArgs e)
{
var url = "http://example.com/download/1.zip";
var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "1.zip");
DownloadFile(url, filepath);
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("下载失败!");
return;
}
MessageBox.Show("下载完成!");
}
以上代码中,我们通过Path.Combine方法获取存储路径,然后通过DownloadFile方法开始下载文件,并在DownloadCompleted事件中添加了下载完成后的处理代码。
以下是一个基于HttpWebRequest对象的示例。假设我们需要下载一个文件,其URL为:http://example.com/download/1.zip。下载完成后,我们需要将下载的文件内容显示在RichTextBox控件中。
private void btnDownload_Click(object sender, EventArgs e)
{
var url = "http://example.com/download/1.zip";
var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "1.zip");
DownloadFile(url, filepath);
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("下载失败!");
return;
}
LoadFileToRichTextBox();
}
private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
this.BeginInvoke((Action)(() =>
{
progressBar1.Value = e.ProgressPercentage;
}));
}
private void LoadFileToRichTextBox()
{
this.BeginInvoke((Action)(() =>
{
var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "1.zip");
using (var sr = new StreamReader(filepath))
{
richTextBox1.Text = sr.ReadToEnd();
}
}));
}
以上代码中,我们通过DownloadFile方法开始异步下载文件,并在DownloadCompleted事件中添加了下载完成后的处理代码LoadFileToRichTextBox。在DownloadProgressChanged事件中更新ProgressBar控件的进度值。在LoadFileToRichTextBox方法中,我们通过StreamReader从下载好的文件中读取内容,再将其显示在RichTextBox控件中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Winform下载文件并显示进度条的实现代码 - Python技术站