[c#]WebClient异步下载文件并显示进度

摘要

在项目开发中经常会用到下载文件,这里使用winform实现了一个带进度条的例子。

一个例子

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Wolfy.DownLoad
{
    public partial class MainFrm : Form
    {
        private string _saveDir;
        public MainFrm()
        {
            InitializeComponent();
            _saveDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "download");
        }

        private void MainFrm_Load(object sender, EventArgs e)
        {

            if (!Directory.Exists(_saveDir))
            {
                Directory.CreateDirectory(_saveDir);
            }

        }

        private void btnDownLoad_Click(object sender, EventArgs e)
        {
            string imageUrl = "http://image.3761.com/nvxing/2016022921/2016022921382152113.jpg";

            string fileExt = Path.GetExtension(imageUrl);
            string fileNewName = Guid.NewGuid() + fileExt;
            bool isDownLoad = false;
            string filePath = Path.Combine(_saveDir, fileNewName);
            if (File.Exists(filePath))
            {
                isDownLoad = true;
            }
            var file = new FileMessage
               {
                   FileName = fileNewName,
                   RelativeUrl = "nvxing/2016022921/2016022921382152113.jpg",
                   Url = imageUrl,
                   IsDownLoad = isDownLoad,
                   SavePath = filePath
               };

            if (!file.IsDownLoad)
            {

                string fileDirPath = Path.GetDirectoryName(file.SavePath);
                if (!Directory.Exists(fileDirPath))
                {
                    Directory.CreateDirectory(fileDirPath);
                }
                try
                {
                    WebClient client = new WebClient();
                    client.DownloadFileCompleted += client_DownloadFileCompleted;
                    client.DownloadProgressChanged += client_DownloadProgressChanged;
                    client.DownloadFileAsync(new Uri(file.Url), file.SavePath, file.FileName);
                }
                catch
                {

                }

            }
        }
        void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.UserState != null)
            {
                this.lblMessage.Text = e.UserState.ToString() + ",下载完成";
            }
        }

        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            this.proBarDownLoad.Minimum = 0;
            this.proBarDownLoad.Maximum = (int)e.TotalBytesToReceive;
            this.proBarDownLoad.Value = (int)e.BytesReceived;
            this.lblPercent.Text = e.ProgressPercentage + "%";
        }
    }
}
复制代码

测试

posted @   wolfy  阅读(12338)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2015-04-12 webservice测试窗体只能用于来自本地计算机的请求
2014-04-12 [Head First设计模式]生活中学设计模式——状态模式
点击右上角即可分享
微信分享提示