关于TNMFTP控件的探讨,高手请进...

keikai 2001-09-04 05:41:10
因为我发现,有两种服务器返回的Listing,只有一种TFTPDircrionary 可以识别,所以,我在TNMFTP的OnListItem事件中实现了列表。
但是,我发现,当文件数目一旦大于一定数目,就List方法就不能够结束进入后继的程序中执行。
前面有人说吧TFtpDirctionary给Clear就ok了,但是我试过,没有用,可能是因为我并没有用她来列表的缘故,不知道那位大侠知道如何解决这个问题?
Code如下:

void __fastcall TMDIChild::FtpDownListItem(AnsiString Listing)
{
//发现不同主机传递过来Listing不一样,需要做不同的解析

AnsiString listCpy = Listing;
AnsiString itemDate,itemSize,itemName,itemProp,strTemp;
int intTmp;
TListItem *pItem;

if(Listing.SubString(11,3).Trim().Length())//第一类
{
strTemp = "<DIR>";
intTmp = Listing.Pos( strTemp );
if(intTmp)//文件夹
//Ex:09-02-01 11:14AM <DIR> 杀入第四空间
{
itemDate = getSect(listCpy);
itemDate = itemDate + " " + getSect(listCpy);
itemProp = getSect(listCpy);//itemProp = "<DIR>"
itemSize = 0;
itemName = getSect(listCpy , true);

if(itemName == ".") //本地路径 ,不需添加
goto END;
else //添加
{
pItem = lvServer->Items->Add();
pItem->Caption = itemName;
if(itemName == "..") //向上
pItem->ImageIndex = 8;
else
pItem->ImageIndex = 2;
pItem->SubItems->Add(itemSize);
pItem->SubItems->Add(itemDate);
pItem->SubItems->Add(itemProp);
}
}else //文件
//Ex:09-02-01 11:07PM 27648 DB_test.exe
{
itemDate = getSect(listCpy);
itemDate = itemDate + " " + getSect(listCpy);
itemProp = "<File>";
itemSize = getSect(listCpy);
itemName = getSect(listCpy , true);

pItem = lvServer->Items->Add();
pItem->Caption = itemName;
pItem->ImageIndex = 5;
pItem->SubItems->Add (itemSize);
pItem->SubItems->Add (itemDate);
pItem->SubItems->Add (itemProp);
}
}else//第二类
{
if(Listing.SubString(1,1) == "d")//文件夹
//Ex: dr-xr-xr-x 1 owner group 0 Apr 22 17:08 Company
{
itemProp = getSect(listCpy);
strTemp = getSect(listCpy);//得到1,不知何用
strTemp = getSect(listCpy);//得到owner
strTemp = getSect(listCpy);//得到group
itemSize = getSect(listCpy);
itemDate = getSect(listCpy);
itemDate += " " + getSect(listCpy);
itemDate += " " + getSect(listCpy);
itemName = getSect(listCpy , true);

if(itemName == ".") //本地路径 ,不需添加
goto END;
else //添加
{
pItem = lvServer->Items->Add();
pItem->Caption = itemName;
if(itemName == "..") //向上
pItem->ImageIndex = 8;
else
pItem->ImageIndex = 2;
pItem->SubItems->Add(itemSize);
pItem->SubItems->Add(itemDate);
pItem->SubItems->Add(itemProp);
}
}
else//文件
//Ex:-r-xr-xr-x 1 owner group 15506 Sep 1 23:08 tree.txt
{
itemProp = getSect(listCpy);
strTemp = getSect(listCpy);//得到1,不知何用
strTemp = getSect(listCpy);//得到owner
strTemp = getSect(listCpy);//得到group
itemSize = getSect(listCpy);
itemDate = getSect(listCpy);
itemDate += " " + getSect(listCpy);
itemDate += " " + getSect(listCpy);
itemName = getSect(listCpy , true);

pItem = lvServer->Items->Add();
pItem->Caption = itemName;
pItem->ImageIndex = 5;
pItem->SubItems->Add (itemSize);
pItem->SubItems->Add (itemDate);
pItem->SubItems->Add (itemProp);
}
}

END:

}

void __fastcall TMDIChild::beforeListDir()
{
FtpDown->FTPDirectoryList->Clear();
lvServer->Items->Clear();
TListItem *pItem = lvServer->Items->Add();
pItem->Caption = "..";
pItem->ImageIndex = 8 ;
}


void __fastcall TMDIChild::afterListDir()
{
//bool tag = false;

AddInfo("成功列出远程目录",clGreen);
RemotePath = FtpDown->CurrentDir ;
if(cmoDirHistory->Items->IndexOf(RemotePath) == -1)
//没有该路径
{
cmoDirHistory->Items->Add (RemotePath);
}
cmoDirHistory->ItemIndex = cmoDirHistory->Items->IndexOf(RemotePath);
//有一种服务器,不提供向上、当前的路径图标的。所以,要在这儿确定一下
//for(int i=0 ; i<lvServer->Items->Count; i++)
//{
//8: parentDir
// if(lvServer->Items->Item[i]->ImageIndex ==8)tag = true;
//}
//if(!tag)//没有上层路径
//{
//TListItem *pItem = lvServer->Items->Add();
//pItem->Caption = "..";
//pItem->ImageIndex = 8 ;
//pItem->SubItems->Add("");
//pItem->SubItems->Add("");
//}
}


void __fastcall TMDIChild::FtpDownSuccess(TCmdType Trans_Type)
{
switch(Trans_Type)
{
case cmdList:
{
afterListDir();
break;
}
case cmdChangeDir:
{
AddInfo("成功改变远程路径",clGreen);
beforeListDir();
FtpDown->List();
//afterListDir();
//加入路径历史框中
break;
}
...
}

void __fastcall TMDIChild::lvServerDblClick(TObject *Sender)
{
selItem = lvServer->GetItemAt (xPos,yPos);
AnsiString selCaption;
if(selItem == NULL)goto END;

selCaption=selItem->Caption;
//Do the Work for download or change dir
if( !FtpDown->Connected )goto END;

if(selItem->ImageIndex == 2 ¦¦ selItem->ImageIndex == 8) //文件夹,则改变路径
{
FtpDown->ChangeDir ( selCaption );
//beforeListDir();
//FtpDown->List ();
//afterListDir();
}
else if(selItem->ImageIndex == 5) //文件,下载
{ //应该先加入下载队列,再使队列自动下载
mDownloadClick(Sender);
//FtpDown->Download (selCaption,LocalPath + "\\" + selItem->Caption );
}

END:
}
...全文
101 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧