ftp多线程上传、下载以及断点续传

上传功能

首先加入默认的配置项(这部分有对应的方法进行设置):

file

异步上传的部分代码

        /// <summary>
        /// 异步上传 (多个文件最好用这个方法)    多线程时设置最大连接数 可以保证按队列先入先出去传输 此时不需要设置线程池中线程数量
        /// </summary>
        /// <param name="fullName"></param>
        /// <param name="fileName">如果为空 默认取上传文件的名称</param>
        /// <param name="process"></param>
        public  void AsynUpload(string fullName,string fileName, Func<FtpState, FtpState> process)
        {
            ManualResetEvent waitObject;
            FtpState state = new FtpState();
            try
            {
                string _port = string.IsNullOrEmpty(port) ? "" : $":{port}";
                fileName = string.IsNullOrEmpty(fileName) ? Path.GetFileName(fullName) : fileName;
                string ftpfullpath = $"ftp://{ipAddr}{_port }//{fileName}"; 
                Uri target = new Uri(ftpfullpath);
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(account, password);
                //request.KeepAlive = false;//是否保存连接  设置了这个并不能生效  异步上传
                request.UseBinary = true;// ftp默认是传输二进制
                request.ServicePoint.ConnectionLimit = maxConnect;//最大连接数

                // Store the request in the object that we pass into the
                // asynchronous operations.
                state.Request = request;
                state.FullName = fullName;
                state.ProcessCall = process;
                state.Operate = FtpOperate.UpLoad;

                //文件大小
                FileInfo file = new FileInfo(fullName);
                state.Size = file.Length;

                // Get the event to wait on.
                waitObject = state.OperationComplete;

                // Asynchronously get the stream for the file contents.
                request.BeginGetRequestStream(
                    new AsyncCallback(EndGetStreamCallback),
                    state
                );

                // Block the current thread until all operations are complete.
                waitObject.WaitOne();

                // The operations either completed or threw an exception.
                if (state.OperationException != null)
                {
                    if (UploadFail != null)
                    {
                        UploadFail.Invoke(state, state.OperationException);
                        return;
                    }
                    throw state.OperationException;
                }
                else
                {
                    if (UploadSuccess != null)
                    {
                        UploadSuccess.Invoke(state, state.StatusDescription);
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                if (UploadFail != null)
                {
                    UploadFail.Invoke(state, ex);
                    return;
                }
            }
        }
利用多线程 异步上传:

file

这个如果设置了线程池的线程数量,并不能控制每次执行的线程数量限制在3个以内,因为异步的连接没有关掉导致了,暂时没有想到怎么关闭好,因为每次创建多个连接 会导致性能不佳(频繁多次连接消耗性能比较大),个人觉得如果是所有上传任务都结束了 再关掉开启的连接 这样是最后,如果你实现了这种方式,欢迎在下方留言。这边设置了ftp的最大连接数为3,如果线程池中线程超过3个,就会进入队列,等队列中有线程完成了,后面才会开启新的线程进入 这个队列(以此类推)。

注意:request.KeepAlive为false, 最终所有连接都会自动关闭,但是频繁连接ftp性能会损耗,不适用太多的文件上传。

下载功能:

file

当然如果是多线程也需要设置,因为这个下载是同步下载的。 ThreadPool.SetMinThreads(1, 1); //设置最小线程数为1个 ThreadPool.SetMaxThreads(5, 5); //设置最大线程数为5个,这两个方法要配合使用才能控制线程数量

效果图:

file

源码地址:https://gitee.com/ten-ken/personal-manage.git

功能示意

file

file

至于断点续传,稍加改造就行了,等你发现哦!

欢迎关注我的公众号:程序员ken,程序之路,让我们一起探索,共同进步。

点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持多线程断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。 点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。 点量Http/FTP组件的功能简介: 标准Http和FTP下载支持:完全标准的Http和FTP协议支持,内部通过网址自动区分是Http还是FTP下载。 极速下载(2.0以后版本):超越国内绝大多数下载软件的下载速度。新版内核在2M ADSL的环境下下载,有些文件的速度可以达到1400K字节/秒以上,超过了带宽的极限。下载速度可以用极速形容。 多线程传输:可以将文件自动分块,并采用多线程下载。并可自由设置线程数目。 断点续传:点量Http/FTP有优秀的断点续传支持,每次启动自动从上次下载的位置开始,不需要重复下载。 提供详细的下载详情接口(2.0以后版本):可以看到整个下载过程的步骤,比如开启了多少线程、服务器的应答过程、错误信息等。 支持多种高级设置:设置线程数目、磁盘缓存大小、搜索镜像服务器的详细参数设置、下载文件完成后同步文件为服务器上的文件时间、下载过程中可以自定义文件临时后缀、未完成的文件设为隐藏属性。 支持磁盘缓存:点量Http/FTP下载DLL支持设置磁盘缓存,减少对磁盘的读写,并提升下载速度。 支持设置Refer:点量Http/FTP下载组件支持设置下载时的Refer,以便可以绕过一些防盗链的网站,直接下载内容。 限速功能:点量Http/FTP下载组件可方便的设置下载限速。 多种磁盘分配方式:点量Http/FTP下载组件支持预分配和边下载边分配两种磁盘方式,满足多种下载需求。 自动搜索镜像加速:点量Http/FTP内置了镜像搜索功能,在下载文件的同时,会自动搜索哪些其它网站还有这个文件,自动从其它网址下载加速。 可提供源码:支付一定的费用,便可以获得全部的点量Http/FTP下载组件的源代码,免除您的所有后顾之忧。 良好的服务:作为点量软件旗下的软件,可享受到点量软件的优秀服务,我们的服务让您如同拥有一个称心的专业员工。 点量Http/FTP 下载组件可以适用于任何Http和FTP下载的领域,让您可以在1天内完成一个完整的Http下载软件的全部功能。比如,您可以用于产品的升级、文件下载传输等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员ken

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值