LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#】WinForm 实现下载文件并显示进度条

admin
2025年5月9日 21:51 本文热度 50

前言

软件开发中,文件下载功能是许多应用程序的常见需求。对于用户而言,不仅希望下载过程稳定高效,还希望能够实时掌握下载进度,从而提升用户体验。而使用 C# .NET 开发的 WinForm 应用程序,我们可以通过简单的代码实现文件下载,并结合进度条(ProgressBar)和标签(Label)来动态显示下载状态。

本文将以一段实际实现的代码为基础,详细讲解如何在 WinForm 中实现文件下载及进度条展示功能。

正文

整体逻辑

该代码段的核心函数是 DownloadFile() 方法,它实现了从指定 URL 下载文件到本地路径的功能,并通过进度条和标签控件实时更新下载进度。

主要流程如下:

1、创建 HTTP 请求获取远程文件;

2、获取文件总大小以设置进度条最大值;

3、创建本地文件流用于写入数据;

4、使用循环读取网络流中的数据块,并写入本地文件;

5、实时计算并更新下载百分比与进度条;

6、异常处理以确保程序稳定性。

代码结构

1、界面部分

界面由一个按钮 btnDown_Click 触发下载事件。

当点击按钮后,会调用 DownloadFile() 方法,传入下载地址、保存路径、进度条控件和标签控件作为参数。

private void btnDown_Click(object sender, EventArgs e)
{
    DownloadFile("http://localhost:1928/WebServer/downloader/123.rar"@"C:\123.rar", progressBar1, label1);
}

注意:上传路径为 "C:\123.rar",注意路径是否正确以及是否有写权限。

2、下载方法

public void DownloadFile(string URL, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1)
{
    float percent = 0;
    try
    {
        // 创建HTTP请求对象
        System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
        System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();

        // 获取文件总大小
        long totalBytes = myrp.ContentLength;

        // 设置进度条最大值
        if (prog != null)
        {
            prog.Maximum = (int)totalBytes;
        }

        // 获取响应流和创建文件流
        System.IO.Stream st = myrp.GetResponseStream();
        System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);

        long totalDownloadedByte = 0;
        byte[] by = newbyte[1024];
        int osize = st.Read(by0, (int)by.Length);

        // 循环读取并写入文件
        while (osize > 0)
        {
            totalDownloadedByte += osize;
            so.Write(by0, osize);

            // 更新进度条和标签
            if (prog != null)
            {
                prog.Value = (int)totalDownloadedByte;
            }

            percent = (float)totalDownloadedByte / (float)totalBytes * 100;
            label1.Text = "当前补丁下载进度:" + percent.ToString("#0.00") + "%";

            // 刷新UI
            System.Windows.Forms.Application.DoEvents();

            // 继续读取下一块数据
            osize = st.Read(by0, (int)by.Length);
        }

        // 关闭流
        so.Close();
        st.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("下载过程中发生错误:" + ex.Message);
    }
}

关键技术

1、多线程问题与 UI 阻塞

由于是直接在主线程中进行网络下载操作,若不及时刷新界面,会导致 UI 卡顿甚至“无响应”。因此,代码中使用了:

System.Windows.Forms.Application.DoEvents();

此方法允许在下载循环过程中接收和处理 Windows 消息,从而保持界面响应。

⚠️ 注意:虽然 DoEvents() 可以暂时解决问题,但在大型项目或复杂场景中更推荐使用后台线程(如 BackgroundWorker 或 async/await 异步编程模型)来避免阻塞主线程。

2、下载速度与缓冲区大小

本例中使用的缓冲区大小为 1KB(1024 字节),这个数值可以根据实际情况调整。

较大的缓冲区可以提高吞吐量,但也会增加内存占用。

例如改为 8KB:

byte[] by = new byte[8192]; // 更改缓冲区大小

3、进度计算与格式化显示

通过比较已下载字节数与总字节数,计算出百分比:

percent = (float)totalDownloadedByte / (float)totalBytes * 100;
label1.Text = "当前补丁下载进度:" + percent.ToString("#0.00") + "%";

其中使用了格式字符串 #0.00 来保留两位小数,使显示更美观。

总结

本文通过完整的WinForm代码实现文件下载,深入讲解了如何实现下载功能并配合控件实时显示进度。整个过程简洁有效,适用于小型工具类应用。

作者:小小工具箱

出处:blog.csdn.net/m0_62355555/article/details/126777817


该文章在 2025/5/10 10:30:44 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved