此实例主要是通过  System.Net.HttpWebRequest 和 System.Net.HttpWebResponse 来实现网络文件的下载

并通过事件返回下载进度信息(启用后台线程进行下载)

项目结构:

项目中包含:

下载类:Downloader.cs  (用于启动线程下载文件,并返回相应的事件)

下载文件信息类:FileInfo.cs(记录要下载的文件信息,包括:文件名称、文件下载路径、文件大小...)

信息显示界面: Form1.cs  控制开始下载、显示下载进度信息,界面如图2

1.下载类  Downloader.cs  详情:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

namespace FileDownload
{
    /// <summary>
    /// 文件下载类
    /// </summary>
    public class Downloader
    {
        public delegate void DelProInfoArg(FileInfo _file);
        public delegate void DeldownloadEndArg();

/// <summary>
        /// 开始下载文件,事件
        /// </summary>
        public event DelProInfoArg DownloadStartingEvent;
        /// <summary>
        /// 分包下载 事件(通知显示更新进度)
        /// </summary>
        public event DelProInfoArg DownloadedEvent;
        /// <summary>
        /// 一个文件下载结束,事件
        /// </summary>
        public event DelProInfoArg DownloadEndEvent;
        /// <summary>
        /// 所有的文件下载结束,事件
        /// </summary>
        public event DeldownloadEndArg DownloadALLEnd;

private List<FileInfo> _waitDownloadFiles;

/// <summary>
        /// 下载一批文件文件
        /// </summary>
        /// <param name="list">文件列表</param>
        public Downloader(List<FileInfo> list)
        {
            _waitDownloadFiles = list;
        }

/// <summary>
        /// 开始下载
        /// </summary>
        public void Start()
        {
            System.Threading.Thread DownloadThread = new System.Threading.Thread(new System.Threading.ThreadStart(StartDownload));
            DownloadThread.IsBackground = true;
            DownloadThread.Start();
        }

/// <summary>
        /// 线程启动,开始获取数据包
        /// </summary>
        private void StartDownload()
        {
            if (_waitDownloadFiles != null && _waitDownloadFiles.Count > 0)
            {

int osize = 0;

foreach (FileInfo file in _waitDownloadFiles)
                {
                    if (DownloadStartingEvent != null)//开始下载
                    {
                        DownloadStartingEvent(file);
                    }
                    try
                    {
                        #region 此处加上这一段是为了能够正常下载https URL的文件,如果不加上这段服务器验证的回调并返回true,则下载https文件时会发生错误,会提示服务器无法通过验证,无法正常下载

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
                       
                        #endregion

System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(file.FileDownloadPath);
                        System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
                        file.SumSize = myrp.ContentLength;
          
                        System.IO.Stream st = myrp.GetResponseStream();
                        System.IO.Stream so = new System.IO.FileStream(file.FileSavePath, System.IO.FileMode.Create);
                       
                        byte[] by = new byte[1024];

osize = st.Read(by, 0, (int)by.Length);

while (osize > 0)
                        {
                            file.DownloadedSize = osize + file.DownloadedSize;

so.Write(by, 0, osize);
                        
                            osize = st.Read(by, 0, (int)by.Length);

if (DownloadedEvent != null)//获取一段数据包,更新显示
                            {
                                DownloadedEvent(file);
                            }
                        }
                        so.Close();
                        st.Close();

if (DownloadEndEvent != null)//一个文件下载完成
                        {
                            DownloadEndEvent(file);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

if (DownloadALLEnd != null)//下载结束
                {
                    DownloadALLEnd();
                }
            }
            else
            {
                if (DownloadALLEnd != null)//下载结束
                {
                    DownloadALLEnd();
                }
            }
        }

/// <summary>
        /// 自定义的服务器证书验证回调方法,这里始终认为存在证书可以下载,返回True
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        protected bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
    }
}

2.文件信息类  FileInfo.cs  详情:

using System;
using System.Collections.Generic;
using System.Text;

namespace FileDownload
{
    /// <summary>
    /// 需要下载的文件信息
    /// </summary>
    public class FileInfo
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="_dowPath">下载路径</param>
        /// <param name="_savPath">文件保存路径</param>
        /// <param name="_fileName">文件名称</param>
        public FileInfo(string _dowPath, string _savPath, string _fileName)
        {
            fileDownloadPath = _dowPath;
            fileSavePath = _savPath;
            fileName = _fileName;
        }

/// <summary>
        /// 文件下载路径,http路径
        /// </summary>
        private string fileDownloadPath;
        /// <summary>
        /// 文件下载路径,http路径
        /// </summary>
        public string FileDownloadPath
        {
            get { return fileDownloadPath; }
            set { fileDownloadPath = value; }
        }

/// <summary>
        /// 文件存储路径,如D:\test\1.txt
        /// </summary>
        private string fileSavePath;
        /// <summary>
        /// 文件存储路径,如D:\test\1.txt
        /// </summary>
        public string FileSavePath
        {
            get { return fileSavePath; }
            set { fileSavePath = value; }
        }
        /// <summary>
        /// 文件名称
        /// </summary>
        private string fileName;
        /// <summary>
        /// 文件名称
        /// </summary>
        public string FileName
        {
            get { return fileName; }
            set { fileName = value; }
        }
        /// <summary>
        /// 文件总大小
        /// </summary>
        private long sumSize;
        /// <summary>
        /// 文件总大小
        /// </summary>
        public long SumSize
        {
            get { return sumSize; }
            set { sumSize = value; }
        }
        /// <summary>
        /// 已下载文件大小
        /// </summary>
        private long downloadedSize;
        /// <summary>
        /// 已下载文件大小
        /// </summary>
        public long DownloadedSize
        {
            get { return downloadedSize; }
            set { downloadedSize = value; }
        }
    }
}

3.文件信息类  Form1.cs  详情:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace FileDownload
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

List<FileInfo> listfiles = null;

private void Form1_Load(object sender, EventArgs e)
        {
            LoadDownloadFileList();
        }

/// <summary>
        /// 加载待下载的文件
        /// </summary>
        private void LoadDownloadFileList()
        {
            string Strpath = System.AppDomain.CurrentDomain.BaseDirectory;//获得应用程序的基目录,即bin/release或debug目录中
            listfiles = new List<FileInfo>();

#region 填充数据
            FileInfo fileone = new FileInfo("http://down.360.cn/360sd/360sd_setup_se_3.0.0.2093G.exe", Path.Combine(Strpath, "文件1"), "文件1");
            listfiles.Add(fileone);

FileInfo filetwo = new FileInfo("http://down.360.cn/360sd/360sd_setup_x64_2.0.0.2061.exe", Path.Combine(Strpath, "文件2"), "文件2");
            listfiles.Add(filetwo);
            #endregion

ListViewItem item=null;
            foreach (FileInfo file in listfiles)
            {
                item=new ListViewItem (new string[]{file.FileName,file.FileDownloadPath,file.FileSavePath});
                listView1.Items.Add(item);
            }

}

/// <summary>
        /// 开始下载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStart_Click(object sender, EventArgs e)
        {
            Downloader download = new Downloader(listfiles);
            download.DownloadStartingEvent += new Downloader.DelProInfoArg(download_DownloadStartingEvent);//事件订阅,开始下载
            download.DownloadedEvent += new Downloader.DelProInfoArg(download_DownloadedEvent);//事件订阅,新获取了数据表,更新显示
            download.DownloadEndEvent += new Downloader.DelProInfoArg(download_DownloadEndEvent);//事件订阅,一个文件下载完成
            download.DownloadALLEnd += new Downloader.DeldownloadEndArg(download_DownloadALLEnd);//事件订阅,所有的下载任务结束
            download.Start();
        }

#region 订阅事件,显示下载进度信息
        void download_DownloadALLEnd()
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new DelShowArg(ShowDownloadingInfo), new object[] {"下载已结束",0,0 });
            }
            else
            {
                ShowDownloadingInfo("下载已结束!", 0, 0);
            }
        }

void download_DownloadEndEvent(FileInfo _file)
        {
            int Downloaded =(int)_file.DownloadedSize / 1024;
            int ALLdownload = (int)_file.SumSize / 1024;

string strDownloadingInfo = string.Format("{0}  已下载完成!",_file.FileName);
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new DelShowArg(ShowDownloadingInfo), new object[] { strDownloadingInfo, ALLdownload, Downloaded });
            }
            else
            {
                ShowDownloadingInfo(strDownloadingInfo, ALLdownload, Downloaded);
            }
        }

void download_DownloadedEvent(FileInfo _file)
        {
            int Downloaded = (int)_file.DownloadedSize / 1024;
            int ALLdownload = (int)_file.SumSize / 1024;

string strDownloadingInfo = string.Format("{0}  正在下载中!", _file.FileName);
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new DelShowArg(ShowDownloadingInfo), new object[] { strDownloadingInfo, ALLdownload, Downloaded });
            }
            else
            {
                ShowDownloadingInfo(strDownloadingInfo, ALLdownload, Downloaded);
            }
        }

void download_DownloadStartingEvent(FileInfo _file)
        {
            int Downloaded = (int)_file.DownloadedSize / 1024;
            int ALLdownload = (int)_file.SumSize / 1024;

string strDownloadingInfo = string.Format("开始下载  {0}!", _file.FileName);
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new DelShowArg(ShowDownloadingInfo), new object[] { strDownloadingInfo, ALLdownload, Downloaded });
            }
            else
            {
                ShowDownloadingInfo(strDownloadingInfo, ALLdownload, Downloaded);
            }
        }

/// <summary>
        /// 自定义数据显示委托
        /// </summary>
        /// <param name="_ShowInfo">显示的文字信息</param>
        /// <param name="_SumSize">总的数据包大小</param>
        /// <param name="_DownloadedSize">已下载数据包大小</param>
        private delegate void DelShowArg(string _ShowInfo, int _SumSize, int _DownloadedSize);

/// <summary>
        /// 显示下载进度信息
        /// </summary>
        /// <param name="_ShowInfo">文字信息</param>
        /// <param name="_SumSize">总的数据包大小</param>
        /// <param name="_DownloadedSize">已下载大小</param>
        private void ShowDownloadingInfo(string _ShowInfo, int _SumSize, int _DownloadedSize)
        {
            lblProInfo.Text = _ShowInfo;

if (_SumSize != 0 && _DownloadedSize != 0)
            {
                Probar.Maximum = _SumSize;
                Probar.Minimum = 0;
                Probar.Value = _DownloadedSize;

lblPercent.Text = string.Format("{0}%", _DownloadedSize * 100 / _SumSize);
            }
        }

#endregion
    }
}

  源码下载

转载于:https://www.cnblogs.com/luowanli/archive/2011/10/20/markeluo.html

Winfrom 线程实现 http、https 文件下载 显示下载进度详情相关推荐

  1. android后台文件下载库,android中如何下载文件并显示下载进度

    最近开发中遇到需要下载文件的问题,对于一般的下载来说不用考虑断点续传,不用考虑多个线程,比如下载一个apk之类的,这篇文章讨论的就是这种情形. 这里主要讨论三种方式:AsyncTask.Service ...

  2. Android中如何下载文件并显示下载进度

    原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ...

  3. python实现http下载文件-Python HTTP下载文件并显示下载进度条功能的实现

    下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: im ...

  4. Unity 最新UnityWebRequest下载,同时显示下载进度,和 显示网速,今天贴出来和大家分享

    Unity 最新UnityWebRequest下载网络资源,支持断点续传.多文件同时下载,同时显示下载进度,和 显示网速,今天贴出来和大家分享 显示网速图片 附上案例链接 可下载 https://do ...

  5. vue下载大文件时浏览器不显示下载进度

    vue下载大文件时浏览器不显示下载进度 问题描述 最近开发中遇到个问题,项目需要下载大文件(音视频),由于后端给我的是视频的地址而不是直接返回流,所以前端用了XMLHttpRequest获取视频流并实 ...

  6. AsyncTask下载网络文件,并显示下载进度

    一些说明 ProgressBar.setProgress(): 刷新UI操作必须运行在UI线程中,但是setProgress()方法里面已经做了同步操作,所以可以在非UI线程中调用 webView.l ...

  7. AsyncTask下载网络图片并显示下载进度

    1.AsyncTask概述 AsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI,AsyncTask封装了Thread和 ...

  8. Android——下载apk文件,并在通知栏显示下载进度

    如何下载apk文件?这里介绍两种方式:一通过异步任务读取文件,二利用系统方法DownloadManager进行下载. 通过异步任务下载apk 文件 public String downloadAsAp ...

  9. android+后台下载notification,Android实现Service下载文件,Notification显示下载进度的示例...

    先放个gif..最终效果如果: 主要演示了Android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演示是在真实的网络环境中使用真实 ...

  10. add to home screen、Google play下载应用launcher显示下载进度图标

    这两种图标的添加都会走AddWorkspaceItemsTask.java,打断点就可以跟踪流程的发起和图标更新. 联系人中点击菜单可以添加快捷方式到桌面 Google play下载应用桌面显示下载进 ...

最新文章

  1. 异常导致循环退出_Java异常有哪些?异常怎么处理?
  2. 在服务器端生成Excel文件然后从服务器下载的本地的代码
  3. 使用Pandas 1.1.0进行稳健的2个DataFrames验证
  4. React开发(155):请求方式得问题
  5. mysql二进制备份配置_mysql针对于二进制数据的备份
  6. 深圳出差 第一天【原创】
  7. 深入理解 Java 之 GC 到底如何工作
  8. “引才入湘”大行动正式启动,CSDN携手万兴科技助力长沙打造人才品牌
  9. 杠上谷歌,微软利用人工智能加码必应搜索的市场竞争力
  10. 通过修改PHP源代码解决Nginx下WebShell跨站的问题
  11. cmd怎么导入mysql文件,使用cmd工具如何导入大容量sql文件到mysql数据库
  12. Atitit httpclient 概述 rest接口 目录 1. Httpclient 利用http协议的client类库与技术方法 1 2. 功能用途 why 2 2.1. 上传下载文件 2
  13. 计算机桌面成英文怎样变成中文版,电脑系统菜单全变成英文怎么办
  14. 从优化角度推导主成分分析法(PCA)的数学原理
  15. Does setting the following sysctl settings require a system reboot?
  16. java 生成短链接_java调用百度API生成短链接(一)
  17. 支付宝网站支付在微信浏览器中跳转问题(亲测,附源码)
  18. 【网络安全】细分领域总览
  19. 如何绘制业务架构图 — 4.流程图
  20. 使用 Shell 运算进行进制转换 16进制转10进制

热门文章

  1. 使用HDR Efex Pro 2 mac版如何合并图像?
  2. 教你如何创建第一个Java应用程序
  3. 中国云计算进入全球通时代 阿里云四大海外数据中心相继开服
  4. samba部署和优化
  5. 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
  6. 01 Servlet Jsp 技术概述
  7. delphi操作word
  8. CentOS 7.2下安装lamp环境
  9. vim 复制到剪切板
  10. CSS 实现文字两端对齐