实现FTP下载进度展示

功能描述:FTP服务器上存有指定路径的文件夹,需要下载文件夹中的所有文件到本地,而且前台界面需要看到文件下载的进度和下载完成后需要通知界面。

问题难点:FTP提供查询某一个文件的大小的方法,但是不提供查询某一个文件夹大小的方法。(如有人知道如何查询文件夹大小的方法可以告知,谢谢!)

解决办法:下载进度不通过已下载/整个文件夹大小的方法展示,通过已下载文件数量/文件夹内整体文件数量的方法展示。

代码:

重新开线程,该线程用于下载FTP文件夹中的文件

 Task.Factory.StartNew(() => { ftp.DownFtpDir("ftp://" + ftpip + "/" + caseresult.ModelGUID + "/" + caseresult.CaseName + "/" + caseresult.DRAW_TYPE + "_" + caseresult.DataType + "/" + username + "/", dir); });

FTP上下载文件夹中的文件

  /// <summary>    
        /// 从FTP下载整个文件夹    
        /// </summary>    
        /// <param name="ftpDir">FTP文件夹路径</param>    
        /// <param name="saveDir">保存的本地文件夹路径</param>    
        public void DownFtpDir(string ftpDir, string saveDir)
        {
            bool start = true;
            while (start)
            {
                try
                {
                    List<FileStruct> files = ListFilesAndDirectories(ftpDir);
                    if (!Directory.Exists(saveDir))
                    {
                        Directory.CreateDirectory(saveDir);
                    }
                    foreach (FileStruct f in files)
                    {
                        if (f.IsDirectory) //文件夹,递归查询  
                        {
                            DownFtpDir(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
                        }
                        else //文件,直接下载  
                        {
                            DownLoadFile(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
                        }
                    }
                    start = false;
                }
                catch (Exception ex)
                {

                }
            }
        }



前台JavaScript代码,如果下载的进度小于0.95则继续获取下载的进度,大于0.95则认为下载已经完成
function getProcess(url, modelguid, casename, imagesArray) {
            $.ajax({
                type: "GET",
                url: url,
                success: function (data) {
                    if (data < 0.95) {            //可能后台由于某个问题终止下载,data永远小于0.95,程序进入死循环,后期解决
                        alert(data);
                        getProcess(url, modelguid, casename, imagesArray);
                    }
                    else {                       
                        $.ajax({
                            type: "GET",
                            url: 'WaterAnimateHandler.ashx?mode=GetImagesPath&DownLoaded=false&modelguid=' + modelguid + '&casename=' + casename + "&ParamName=" + results.options[cases.selectedIndex].value + "&dir=" + "",
                            success: function (data) {                              ///返回的数据 第一位:标识是否本地文件与服务器文件数量一致;第二位:本地文件地址;第三位。。最后图片名称
                                var imagesArray = new Array();
                                imagesArray = data.split('\n');
                                ImagesAnimate(imagesArray, casename, modelguid);
                            }
                        });
                    }
                }
            });
        }


后台访问本地文件夹,获取本地文件内当前文件的数量,通过本地文件的数量/FTP服务器上的文件的数量获得当前下载的进度
 public void GetDownLoadProcess(HttpContext context)
        {
            string path = context.Request.QueryString["dir"];
            DirectoryInfo file = new DirectoryInfo(path);
            FileInfo[] filesCount = file.GetFiles();
            double process = (double)filesCount.Count() / (double)imagescount;
            context.Response.Write(process.ToString());
        }




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值