您的位置:首页 > 编程语言 > PHP开发

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

2009-09-05 13:28 741 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: