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);