关于FTP client下载进度条的开发与实现思路

http://topic.csdn.net/u/20090514/09/81bc1ce2-c7d9-4fd2-863d-9bda4242666a.html

 

在这找到相同问题的朋友都在问我是怎么做的,我开始也郁闷了很久,其实还是想的笨办法;

大家都知道,要实现FTP client上传下载时,实时体现它的进度,就要捕获文件流/网络流的读取字节数。

所以要点就是不管你怎么实现FTP client,要注意找到它Upload/Download的最终读写文件流的方法,

然后在这里通过事件委托将进度值传到界面处理。

 

下面是我在LumiSoft.Net.FTP.Client中用FTP_Client做修改的实现的思路

在FTP_Client和其子类DataConnection

 

添加 

 //为了捕捉进度而增加的委托
            public event ProgressChangedHandler DataProgressChanged;
            //public event ProgressChangedHandler ProgressChanged;
            protected void OnDataProgressChanged(object sender, FTPProgressChangedEventArgs e)
            {
                if (DataProgressChanged != null)
                {
                    DataProgressChanged(sender, e);
                }
            }

 

 

修改子类DataConnection的TransferStream方法,这样winform界面就可以用事件来捕获你要实现的进度了

        #region method TransferStream

            /// <summary>
            /// Copies all source stream data to the specified target stream.
            /// </summary>
            /// <param name="source">Source stream.</param>
            /// <param name="target">Target stream.</param>
            private long TransferStream(Stream source,Stream target)
            {
                long   totalReadedCount = 0;
                byte[] buffer           = new byte[32000];
                while(true){
                  
                    int readedCount = source.Read(buffer,0,buffer.Length);
                    // End of stream reached, we readed all data sucessfully.
                    if(readedCount == 0){
                        return totalReadedCount;
                    }
                    else{
                        target.Write(buffer,0,readedCount);
                        totalReadedCount += readedCount;
                        if (source is NetworkStream)
                        {
                            //NetworkStream ns = (NetworkStream)source;
                            //OnDataProgressChanged(this, new FTPProgressChangedEventArgs(totalReadedCount, ns));
                            if (target is FileStream)
                            {
                                System.IO.FileStream fs = (System.IO.FileStream)target;
                                OnDataProgressChanged(this, new FTPProgressChangedEventArgs(totalReadedCount, fs));
                            }
                        }
                        else if (source is FileStream)
                        {
                            System.IO.FileStream fs = (System.IO.FileStream)source;
                            OnDataProgressChanged(this, new FTPProgressChangedEventArgs(totalReadedCount, fs));
                        }
                        else
                        {
                            //OnDataProgressChanged(this, new FTPProgressChangedEventArgs(totalReadedCount));
                        }
                        m_LastActivity = DateTime.Now;
                    }
                }
            }

            #endregion

 

 

///再添加下面的事件类和委托

 

    public delegate void ProgressChangedHandler(object sender, FTPProgressChangedEventArgs e);

    public class FTPProgressChangedEventArgs : EventArgs
    {
        private string m_GreetingText = "";
        private long progress;
        private object state = "";
        public FTPProgressChangedEventArgs(long progressPercentage)
        {
            progress = progressPercentage;
        }
        public FTPProgressChangedEventArgs(object userState)
        {
            state = userState;
        }
        public FTPProgressChangedEventArgs(string greeting_text)
        {
            m_GreetingText = greeting_text;
        }
        public FTPProgressChangedEventArgs(long progressPercentage, object userState)
        {
            progress = progressPercentage;
            state = userState;
        }

        public long ProgressPercentage { get { return progress; } }
        public object UserState { get { return state; } }
        public string GreetingText
        {
            get
            {
                return m_GreetingText;
            }
        }
    }

 

///在winform里要做的就是:

 

FTP_Client  ftpd = new FTP_Client();

 ftpd.ProgressChanged += new LumiSoft.Net.FTP.Client.ProgressChangedHandler(ftpd_ProgressChanged);//这里注意跨线程访问界面的控件(进度条)也要用委托处理

...

 

每次上传下载文件时注意做的是:

//先设定好文件的最大和最小值(下载时要的先读到下载文件的大小)

ftpd.ftpdProgressBarMinimum(0);

ftpd.ftpdProgressBarMaximum((int)fs.Length );

ftpd.Upload/Download(storefilename, fs);

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值