FTPダウンロード進捗展示を実現

3931 ワード

機能説明:FTPサーバーに指定されたパスのフォルダが保存されており、フォルダ内のすべてのファイルをローカルにダウンロードする必要があり、フロントインタフェースはファイルのダウンロードの進捗状況とダウンロードが完了した後にインタフェースに通知する必要がある.
難点:FTPはファイルのサイズをクエリーする方法を提供しますが、フォルダのサイズをクエリーする方法は提供されません.△フォルダのサイズを調べる方法を知っている人がいたら、教えてください.ありがとうございます.
解決策:ダウンロードの進捗状況は、ダウンロード済み/フォルダ全体のサイズの方法で表示されず、ダウンロード済みファイルの数/フォルダ内のファイル全体の数の方法で表示されます.
コード:
FTPフォルダのファイルをダウンロードするスレッドを再開
 Task.Factory.StartNew(() => { ftp.DownFtpDir("ftp://" + ftpip + "/" + caseresult.ModelGUID + "/" + caseresult.CaseName + "/" + caseresult.DRAW_TYPE + "_" + caseresult.DataType + "/" + username + "/", dir); });

FTP上でフォルダの中のファイルをダウンロードします
  ///     
        ///  FTP           
        ///     
        /// FTP         
        ///               
        public void DownFtpDir(string ftpDir, string saveDir)
        {
            bool start = true;
            while (start)
            {
                try
                {
                    List 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('
'); ImagesAnimate(imagesArray, casename, modelguid); } }); } } }); }

バックグラウンドでローカルフォルダにアクセスし、ローカルファイル内の現在のファイルの数を取得し、ローカルファイルの数/httpサーバ上のファイルの数で現在のダウンロードの進捗状況を取得します.
 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());
        }