关于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);
在这找到相同问题的朋友都在问我是怎么做的,我开始也郁闷了很久,其实还是想的笨办法;
大家都知道,要实现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);
相关文章推荐
- Java利用Apache的FTPClient包实现FTP的上传与下载
- Ftp上传下载文件,并能自定义进度条展示(FtpClient)
- 利用FTPClient类实现文件的上传下载功能
- 【Android开发经验】关于“多线程断点续传下载”功能的一个简单实现和讲解
- 居于Web的进度条实现思路(下载百分比)
- FTPClientHelper辅助类 实现文件上传,目录操作,下载等操作
- 关于文件上传下载以及其他进度条的实现
- JAVA中使用FTPClient实现文件上传下载
- Java FTPClient实现文件上传下载
- 关于数据库自动化运维平台的设计及开发实现思路 推荐
- iOS开发-实现大文件下载与断点下载思路
- c#开发-实现从FTP服务器上下载文件夹中的数据
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
- JAVA中使用FTPClient实现文件上传下载(键人岐)
- JAVA中使用FTPClient实现文件上传下载
- JAVA中的FtpClient与FTPClient,并实现jsp页面下载ftp服务器上的文件
- JAVA中使用FTPClient实现文件上传下载
- java 中 FtpClient 实现 FTP 文件上传、下载
- warensoft .NET快速开发系列--C#实现文件下载并(多线程+WebReqeust+进度条)
- Ftp上传下载文件,并能自定义进度条展示(FtpClient)