调用类clsFTP 
类内容详见:http://www.chenjiliang.com/Article/View.aspx?ArticleID=2366&TypeID=84 目的:做一个程序在FTP上下载数据,并显示进度条! 
遇到的问题:无法获取FTP上文件的大小,进度条无法显示。 
代码如下:       private void button1_Click(object sender, EventArgs e)  //下载按钮 
        { 
            lb_upload.Text = "正在下载文件,请等待..."; 
            cf = new clsFTP(new Uri("ftp://222.76.217.169"), "用户名", "密码"); 
            string rfile = "zk.rar"; 
            cf.DownloadProgressChanged += new clsFTP.De_DownloadProgressChanged(cf_DownloadProgressChanged); \\获取进度 
            cf.DownloadFileAsync(rfile, "c:\\","1.rar");        }         public void cf_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
        { 
            this.pgrBarFileUpload.Maximum = (int)e.TotalBytesToReceive;  //这个语句本来是要获取文件的大小,但好像要下载完后,才能获取到,。 
            //this.pgrBarFileUpload.Maximum = 1573439;  //自己找出文件大小,并填上去。进度条可正常运行。 
            this.pgrBarFileUpload.Value = (int)e.BytesReceived;  //这个没问题。 
        } 
大家做过这种程序吗?如何正确获取文件大小附值给pgrBarFileUpload.Maximum 

解决方案 »

  1.   

    需要修改FileStruct、ListFilesAndDirectories,本来是获取到文件大小信息的,但是在他包装这个FTP类的时候,将文件大小给过滤掉了,没有提取,你需要自己改写那个结构和函数,先输入全部信息看下返回的格式,然后提取。
      

  2.   

    算了,好事做到底,帮你改好那两算了。    public struct FileStruct
        {
            public string Flags;
            public string Owner;
            public string Group;
            public long size;  //这是新加的文件大小,单位(字节)。
            public bool IsDirectory;
            public DateTime CreateTime;
            public string Name;
        }        private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
            {
                FileStruct f = new FileStruct();
                string processstr = Record.Trim();
                f.Flags = processstr.Substring(0, 10);
                f.IsDirectory = (f.Flags[0] == 'd');
                processstr = (processstr.Substring(11)).Trim();
                _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);   //跳过一部分
                  f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
                f.Group = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
                f.size = long.Parse(_cutSubstringFromStringWithTrim(ref processstr, ' ', 0));   //获取文件大小。
                string yearOrTime = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2];
                if (yearOrTime.IndexOf(":") >= 0)  //time
                {
                    processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());
                }
                f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr, ' ', 8));
                f.Name = processstr;   //最后就是名称
                return f;
            }
    把上面两个函数替换原来的函数即可,我之修改了Unix样式下的函数,Windows样式下的因为找不到这样的格式,没做修改(现在估计也找不到Windows样式的FTP服务器了吧)。
    用的时候你将一次性获取到的文件信息数组中的size和你的实际下载文件名比较,找到一致的就读取它的size。另外他这个封装并不好,只能参考,还没成熟到可以使用的程度,因为它每次发送请求都是重新连接,没考虑已经建立的连接,效率很低,也正因为这样,它不能持续操作,类似改变目录、设置UTF8编码的命令都无法使用。
      

  3.   

    感谢这位大哥,已经解决问题,但还有一个疑问,就是this.pgrBarFileUpload.Maximum = (int)e.TotalBytesToReceive;  //这个语句本来是要获取文件的大小,但好像要下载完后,才能获取到,。 另外不知道这位大哥有没有更加完善的FTP类,有的话最好能发一份给小弟。毕竟问题解决了,先给分吧
      

  4.   

    在被动 FTP 连接中(pasv模式),服务器不发送已下载文件的大小,e.ProgressPercentage和e.TotalBytesToReceive都是0。