调用类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
类内容详见: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
解决方案 »
- WinForm中DateTimePicker控件获不了焦点,微软的bug吗?
- VS2008 制作装项目的问题??
- c#中生成随机数,random怎么用?
- c#怎么写文件啊 急啊 救命!!!!
- 菜鸟问个高手才能会的问题,如何把1个word文件以二进制的方式存到数据库的表里,再取出来,请高手帮忙啊!!
- C# 对Webbrowser实事抓图及资源消耗大的问题
- 请各位天才介绍一本有HOOK 钩 的书 发现我个人研究比较迷茫!
- winform程序错误提示:"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
- comboBox.ValueMember出错
- 用C#实现作图的功能
- 如何在主函数中使用另一个文件中的结果
- 问个GDI+问题
{
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编码的命令都无法使用。