实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果!

废话不多说,先看掩饰效果:

具体实现步骤如下:

1.新建项目:WinBatchDownload

2.先建一个Windows窗体:FrmBatchDownload,加载事件FrmBatchDownload_Load

3.放置一个Button按钮:btnStartDownLoad,单机事件btnStartDownLoad_Click

4.放置一个DataGridView:dgvDownLoad.

5.具体代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
#region 命名空间using System.Threading;
using System.Runtime.InteropServices;
using System.Net;
using System.Collections;#endregionnamespace WinBatchDownload
{public partial class FrmBatchDownload : Form{#region 全局成员//存放下载列表List<SynFileInfo> m_SynFileInfoList;#endregion#region 构造函数public FrmBatchDownload(){InitializeComponent();m_SynFileInfoList = new List<SynFileInfo>();}#endregion#region 窗体加载事件private void FrmBatchDownload_Load(object sender, EventArgs e){//初始化DataGridView相关属性
            InitDataGridView(dgvDownLoad);//添加DataGridView相关列信息
            AddGridViewColumns(dgvDownLoad);//新建任务
            AddBatchDownload();}#endregion#region 添加GridView列/// <summary>/// 正在同步列表/// </summary>void AddGridViewColumns(DataGridView dgv){dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "DocID",HeaderText = "文件ID",Visible = false,Name = "DocID"});dgv.Columns.Add(new DataGridViewTextBoxColumn(){AutoSizeMode = DataGridViewAutoSizeColumnMode.None,DataPropertyName = "DocName",HeaderText = "文件名",Name = "DocName",Width = 300});dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "FileSize",HeaderText = "大小",Name = "FileSize",});dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "SynSpeed",HeaderText = "速度",Name = "SynSpeed"});dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "SynProgress",HeaderText = "进度",Name = "SynProgress"});dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "DownPath",HeaderText = "下载地址",Visible = false,Name = "DownPath"});dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "SavePath",HeaderText = "保存地址",Visible = false,Name = "SavePath"});dgv.Columns.Add(new DataGridViewTextBoxColumn(){DataPropertyName = "Async",HeaderText = "是否异步",Visible = false,Name = "Async"});}#endregion#region 添加下载任务并显示到列表中void AddBatchDownload(){//清空行数据
            dgvDownLoad.Rows.Clear();//添加列表(建立多个任务)List<ArrayList> arrayListList = new List<ArrayList>();arrayListList.Add(new ArrayList(){"0",//文件id"PPTV客户端.exe",//文件名称"21.2 MB",//文件大小"0 KB/S",//下载速度"0%",//下载进度"http://download.pplive.com/pptvsetup_3.2.1.0076.exe",//远程服务器下载地址"D:\\PPTV客户端.exe",//本地保存地址true//是否异步
            });arrayListList.Add(new ArrayList(){"1","PPS客户端.exe","14.3 MB","0 KB/S","0%","http://download.ppstream.com/ppstreamsetup.exe","D:\\PPS客户端.exe",true});arrayListList.Add(new ArrayList(){"2","美图看看客户端.exe","4.1 MB","0 KB/S","0%","http://kankan.dl.meitu.com/V2/1029/KanKan_kk360Setup.exe","D:\\美图看看客户端.exe",true});foreach (ArrayList arrayList in arrayListList){int rowIndex = dgvDownLoad.Rows.Add(arrayList.ToArray());arrayList[2] = 0;arrayList.Add(dgvDownLoad.Rows[rowIndex]);//取出列表中的行信息保存列表集合(m_SynFileInfoList)中m_SynFileInfoList.Add(new SynFileInfo(arrayList.ToArray()));}}#endregion#region 开始下载按钮单机事件private void btnStartDownLoad_Click(object sender, EventArgs e){//判断网络连接是否正常if (isConnected()){//设置不可用btnStartDownLoad.Enabled = false;//设置最大活动线程数以及可等待线程数ThreadPool.SetMaxThreads(3, 3);//判断是否还存在任务if (m_SynFileInfoList.Count <= 0) AddBatchDownload();foreach (SynFileInfo m_SynFileInfo in m_SynFileInfoList){//启动下载任务
                    StartDownLoad(m_SynFileInfo);}}else{MessageBox.Show("网络异常!");}}#endregion#region 检查网络状态//检测网络状态[DllImport("wininet.dll")]extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);/// <summary>/// 检测网络状态/// </summary>bool isConnected(){int I = 0;bool state = InternetGetConnectedState(out I, 0);return state;}#endregion#region 使用WebClient下载文件/// <summary>/// HTTP下载远程文件并保存本地的函数/// </summary>void StartDownLoad(object o){SynFileInfo m_SynFileInfo = (SynFileInfo)o;m_SynFileInfo.LastTime = DateTime.Now;//再次new 避免WebClient不能I/O并发 WebClient client = new WebClient();if (m_SynFileInfo.Async){//异步下载client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);client.DownloadFileAsync(new Uri(m_SynFileInfo.DownPath), m_SynFileInfo.SavePath, m_SynFileInfo);}else client.DownloadFile(new Uri(m_SynFileInfo.DownPath), m_SynFileInfo.SavePath);}/// <summary>/// 下载进度条/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e){SynFileInfo m_SynFileInfo = (SynFileInfo)e.UserState;m_SynFileInfo.SynProgress = e.ProgressPercentage + "%";double secondCount = (DateTime.Now - m_SynFileInfo.LastTime).TotalSeconds;m_SynFileInfo.SynSpeed = FileOperate.GetAutoSizeString(Convert.ToDouble(e.BytesReceived / secondCount), 2) + "/s";//更新DataGridView中相应数据显示下载进度m_SynFileInfo.RowObject.Cells["SynProgress"].Value = m_SynFileInfo.SynProgress;//更新DataGridView中相应数据显示下载速度(总进度的平均速度)m_SynFileInfo.RowObject.Cells["SynSpeed"].Value = m_SynFileInfo.SynSpeed;}/// <summary>/// 下载完成调用/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e){//到此则一个文件下载完毕SynFileInfo m_SynFileInfo = (SynFileInfo)e.UserState;m_SynFileInfoList.Remove(m_SynFileInfo);if (m_SynFileInfoList.Count <= 0){//此时所有文件下载完毕btnStartDownLoad.Enabled = true;}}#endregion#region 需要下载文件实体类class SynFileInfo{public string DocID { get; set; }public string DocName { get; set; }public long FileSize { get; set; }public string SynSpeed { get; set; }public string SynProgress { get; set; }public string DownPath { get; set; }public string SavePath { get; set; }public DataGridViewRow RowObject { get; set; }public bool Async { get; set; }public DateTime LastTime { get; set; }public SynFileInfo(object[] objectArr){int i = 0;DocID = objectArr[i].ToString(); i++;DocName = objectArr[i].ToString(); i++;FileSize = Convert.ToInt64(objectArr[i]); i++;SynSpeed = objectArr[i].ToString(); i++;SynProgress = objectArr[i].ToString(); i++;DownPath = objectArr[i].ToString(); i++;SavePath = objectArr[i].ToString(); i++;Async = Convert.ToBoolean(objectArr[i]); i++;RowObject = (DataGridViewRow)objectArr[i];}}#endregion#region 初始化GridViewvoid InitDataGridView(DataGridView dgv){dgv.AutoGenerateColumns = false;//是否自动创建列dgv.AllowUserToAddRows = false;//是否允许添加行(默认:true)dgv.AllowUserToDeleteRows = false;//是否允许删除行(默认:true)dgv.AllowUserToResizeColumns = false;//是否允许调整大小(默认:true)dgv.AllowUserToResizeRows = false;//是否允许调整行大小(默认:true)dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;//列宽模式(当前填充)(默认:DataGridViewAutoSizeColumnsMode.None)dgv.BackgroundColor = System.Drawing.Color.White;//背景色(默认:ControlDark)dgv.BorderStyle = BorderStyle.Fixed3D;//边框样式(默认:BorderStyle.FixedSingle)dgv.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal;//单元格边框样式(默认:DataGridViewCellBorderStyle.Single)dgv.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;//列表头样式(默认:DataGridViewHeaderBorderStyle.Single)dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;//是否允许调整列大小(默认:DataGridViewColumnHeadersHeightSizeMode.EnableResizing)dgv.ColumnHeadersHeight = 30;//列表头高度(默认:20)dgv.MultiSelect = false;//是否支持多选(默认:true)dgv.ReadOnly = true;//是否只读(默认:false)dgv.RowHeadersVisible = false;//行头是否显示(默认:true)dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//选择模式(默认:DataGridViewSelectionMode.CellSelect)
        }#endregion#region 文件相关操作类分/// <summary>/// 文件有关的操作类/// </summary>public class FileOperate{#region 相应单位转换常量private const double KBCount = 1024;private const double MBCount = KBCount * 1024;private const double GBCount = MBCount * 1024;private const double TBCount = GBCount * 1024;#endregion#region 获取适应大小/// <summary>/// 得到适应大小/// </summary>/// <param name="size">字节大小</param>/// <param name="roundCount">保留小数(位)</param>/// <returns></returns>public static string GetAutoSizeString(double size, int roundCount){if (KBCount > size) return Math.Round(size, roundCount) + "B";else if (MBCount > size) return Math.Round(size / KBCount, roundCount) + "KB";else if (GBCount > size) return Math.Round(size / MBCount, roundCount) + "MB";else if (TBCount > size) return Math.Round(size / GBCount, roundCount) + "GB";else return Math.Round(size / TBCount, roundCount) + "TB";}#endregion}#endregion}
}

到此批量下载功能实现完毕,上面写的代码比较灵活,需要的朋友可以根据自己的项目修改相关内容。

最后附上源码:WinBatchDownload.zip

作者:曾庆雷
出处:http://www.cnblogs.com/zengqinglei
本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利

转载于:https://www.cnblogs.com/zengqinglei/archive/2012/11/09/2762154.html

C#异步批量下载文件相关推荐

  1. Net WebClient 异步批量下载文件

    1.文件提前使用爬虫整理好,放到了demo文件夹下的1.txt文件中,文件格式如: http://www.banktunnel.eu/tumblr.com/tabea-lara.2_files/tum ...

  2. python批量下载文件教程_超简单超详细python小文件、大文件、批量下载教程

    按照不同的情况,python下载文件可以分为三种: 小文件下载 大文件下载 批量下载 python 小文件下载 流程:使用request.get请求链接,返回的内容放置到变量r中,然后将r写入到你想放 ...

  3. java批量下载文件为zip包

    批量下载文件为zip包的工具类 package com.meeno.trainsys.util;import javax.servlet.http.HttpServletRequest; import ...

  4. python批量下载文件-Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...

  5. python批量下载网页文件-Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...

  6. mysql 线程池 下载_java线程池实现批量下载文件

    本文实例为大家分享了java线程池实现批量下载文件的具体代码,供大家参考,具体内容如下 1 创建线程池 package com.cheng.webb.thread; import java.util. ...

  7. php批量下载TXT中的URL,需求是这样,再不改变目录结构的前提下,通过URL,批量下载文件,我已经写好了一点儿了...

    //需求是这样,再不改变目录结构的前提下,通过URL,批量下载文件,我已经写好了一点儿了 //但是有点bug,只能下载最后一个文件 //邱老师解决一下 $file=fopen("q.txt& ...

  8. 如何用python批量下载数据_Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...

  9. python 下载文件-Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型
  2. leetcode 392
  3. dp主机_MODBUS 和 PROFIBUS-DP 协议有什么区别
  4. 斐波那契数列规律的计算。
  5. C# 读取根目录的json文件中的某个值
  6. 华为 5G 遭受致命一击!
  7. java静态方法求n,java之静态属性和静态方法
  8. Lesson2.2 2.3 Maya command reference quick help
  9. 【操作系统】进程管理(二)
  10. Linux下MongoDB服务安装
  11. JSP校园自行车租赁网站平台管理系统
  12. HTML+CSS 模仿淘宝部分网页(未实现事件)
  13. qt 飞扬青云_Qt编写图片及视频TCP/UDP网络传输
  14. Redis锁,悲观锁和乐观锁
  15. 安达智能通过注册:拟募资11.7亿 刘飞与何玉姣夫妇为大专学历
  16. 使用telnet连接qq pop服务器拉取邮件
  17. 360度全景效果图制作步骤是什么?
  18. 业内首发 | 区块链数据服务 - BDS
  19. GSYVideoPlayer实现视频播放
  20. 机械设计自动化行业现在吃香吗?有前途吗?

热门文章

  1. 英伟达显卡bios修改工具_终于可以吃鸡了!英伟达入门级图灵显卡1650S开卖,性能提升25%...
  2. Linux非系统盘挂载,[转载] Linux mount 挂载分区、硬盘
  3. FIR设置过采样率 matlab,Xilinx FIR IP的介绍与仿真
  4. android 串口一直打开_实例 | 使用Python串口实时显示数据并绘图
  5. django登录连接html,Django——登录功能(连接mysql)
  6. python3读取网页_python3+selenium获取页面加载的所有静态资源文件链接操作
  7. 搞技术多少要有点危机意识,切不可温水煮青蛙
  8. 详解PCB抄板过程,太牛了!
  9. idea创建包怎么让包分层_idea创建Spring项目的方法步骤(图文)
  10. java 初级编程题_java基础经典编程题