作者: 王龙
查看: 7713|回复: 12

[源码] 【批量下载】c# 多线程多文件批量下载

[复制链接]
王龙 发表于 2017-7-8 17:51:53 | 显示全部楼层 |阅读模式
查看: 7713|回复: 12
说明:
开发过程中其实总是会碰到项目想应用下载文件~
看其他语言有很多封装好的类库可以使用~~
作为小白的我并没有找到很多c#的案例可参考
后找到一款“MutThreadDownLoadFile”的demo
但是每次使用感觉并不方便,另外可用信息可扩展不是特别强。。
然后重新改进并封装了类库的形式,可以简单使用

效果截图:



贴出此demo的代码看一下:
[C#] 纯文本查看 复制代码
        DownLoadFile dlf = new DownLoadFile();
        private void btnTest_Click(object sender, EventArgs e)
        {
            string[] lines = File.ReadAllLines("华军软件.txt");
            for (int i = 0; i < lines.Length; i++)
            {
                string[] line = lines.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                if (line.Length == 2)
                {
                    string path = Uri.EscapeUriString(line[1]);
                    string filename = Path.GetFileName(path);
                    string dir = @"D:        est";
                    ListViewItem item = listView1.Items.Add(new ListViewItem(new string[] { (listView1.Items.Count + 1).ToString(), filename, "0", "0", "0%", "0", "0", DateTime.Now.ToString(), "等待中", line[1] }));
                    int id = item.Index;
                    dlf.AddDown(path, dir, "", id);
                }
            }
            dlf.StartDown();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dlf.ThreadNum = 3;//线程数,不设置默认为3
            dlf.doSendMsg += SendMsgHander;//下载过程处理事件
        }
        private void SendMsgHander(DownMsg msg)
        {
            switch (msg.Tag)
            {
                case DownStatus.Start:
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        listView1.Items[msg.Id].SubItems[8].Text = "开始下载";
                        listView1.Items[msg.Id].SubItems[7].Text = DateTime.Now.ToString();
                    });
                    break;
                case DownStatus.GetLength:
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        listView1.Items[msg.Id].SubItems[3].Text = msg.LengthInfo;
                        listView1.Items[msg.Id].SubItems[8].Text = "连接成功";
                    });
                    break;
                case DownStatus.End:
                case DownStatus.DownLoad:
                    this.Invoke(new MethodInvoker(() =>
                    {
                        this.Invoke((MethodInvoker)delegate ()
                        {
                            listView1.Items[msg.Id].SubItems[2].Text = msg.SizeInfo;
                            listView1.Items[msg.Id].SubItems[4].Text = msg.Progress.ToString() + "%";
                            listView1.Items[msg.Id].SubItems[5].Text = msg.SpeedInfo;
                            listView1.Items[msg.Id].SubItems[6].Text = msg.SurplusInfo;
                            if (msg.Tag == DownStatus.DownLoad)
                            {
                                listView1.Items[msg.Id].SubItems[8].Text = "下载中";
                            }
                            else
                            {
                                listView1.Items[msg.Id].SubItems[8].Text = "下载完成";
                            }
                            Application.DoEvents();
                        });
                    }));
                    break;
                case DownStatus.Error:
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        listView1.Items[msg.Id].SubItems[6].Text = "失败";
                        listView1.Items[msg.Id].SubItems[8].Text = msg.ErrMessage;
                        Application.DoEvents();
                    });
                    break;
            }
        }


应用时不考虑下载过程
只需要添加下载的文件
设定好下载线程以及最多每次下载几个文件(默认为3)即可

希望这次的封装,可以帮到其他需要应用到该类库的朋友

由于时间的关系,只是花了两天的时间测试和完善,可能很多地方考虑的并不是很周全(暂时没发现太明显bug)
大家可以应用并测试后反馈在这个地方,方便我们一起更好的完善它!

下载地址:


回复 论坛版权

使用道具 举报

Even 发表于 2017-7-11 17:03:39 | 显示全部楼层
還不錯~看看哦~
root111 发表于 2017-7-12 16:40:55 | 显示全部楼层
大爱楼主无私共享
一生繁华 发表于 2017-7-15 10:00:28 | 显示全部楼层
大爱楼主无私共享
NEKO 发表于 2017-10-30 22:46:26 | 显示全部楼层
good ~ 研究一下
jkevIn 发表于 2017-11-1 17:19:46 | 显示全部楼层
学习一下。。。。。
回复

使用道具 举报

hp874a6 发表于 2017-11-21 22:14:13 | 显示全部楼层
这个学习一下,比较好的
QW去 发表于 2018-1-9 12:52:18 | 显示全部楼层
感谢楼主分享
zpchlover 发表于 2018-7-28 13:33:30 | 显示全部楼层
感谢分享!!
回复

使用道具 举报

alexhan 发表于 2018-11-6 13:53:59 | 显示全部楼层
很差不错的东西 支持支持!
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-3-29 08:34, Processed in 0.604759 second(s), 32 queries , Gzip On.

快速回复 返回顶部 返回列表