实现FTP下载进度展示

来源:互联网 发布:python twisted adbapi 编辑:程序博客网 时间:2024/06/05 04:00

功能描述: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());        }




原创粉丝点击