ftp遍历文件夹
请教一个使用Indy10控件 ftp遍历文件夹的问题。
ftp是成功连接的,以下是主要代码。
在头文件中定义结构和list类型 如下:
AnsiString curname; //本地文件名
TList *dirString;
struct TDirList
{
char filename[200]; //文件名
char upfilename[200]; //上级文件名
int dir; //文件类型
int num; //遍历标志
};
typedef TDirList* MList;
idftp2->Connect();
dirString = new TList();
dirString->Clear();
this->SelectListDir(this->hostlist);
bool TForm2::SelectListDir(AnsiString dir) //自定义函数
{
try
{
int i = 0;
MList mylist;
AnsiString filename = ""; //当前文件夹或文件名
AnsiString len = "";
AnsiString uplen = ""; //当前文件或文件夹的上级目录(完整路径)
idftp2->ChangeDir(dir);
idftp2->List();
mylist = new TDirList;
if( idftp2->DirectoryListing->Count == 0 ) //如果当前文件为空文件夹
{
StrECopy(mylist->filename,filename.c_str());
len = (AnsiString)mylist->filename;
mylist->filename[len.Length() + 1] = 0x0; //给结构元素赋值
StrECopy(mylist->upfilename,dir.c_str());
uplen = (AnsiString)mylist->upfilename;
mylist->upfilename[uplen.Length() + 1] = 0x0; //给结构元素赋值
mylist->dir = -1; //-1表示该文件夹为空
mylist->num = 1;
dirString->Add(mylist); //加入队列
return true;
}
else
{
if(dir == this->hostlist) //curname用于记录当前文件的绝对路径
{
curname = dir ;
}
else
{
curname += "\" + dir;
}
while( i <= idftp2->DirectoryListing->Count)
{
filename = AnsiToUtf8(idftp2->DirectoryListing->Items[i]->FileName);
StrECopy(mylist->filename,filename.c_str());
len = (AnsiString)mylist->filename;
mylist->filename[len.Length() + 1] = 0x0;
StrECopy(mylist->upfilename,curname.c_str());
uplen = (AnsiString)mylist->upfilename;
mylist->upfilename[uplen.Length() + 1] = 0x0;
mylist->num = 1; //给结构元素赋值
if(idftp2->DirectoryListing->Items[i]->ItemType == ditFile)
{
mylist->dir = 1; //表示为文件
dirString->Add(mylist); //加入队列
continue;
}
else
{
mylist->dir = 0; //表示为文件夹
dirString->Add(mylist); //加入队列
SelectListDir(filename.c_str()); //如果是文件夹,进入递归
}
i++;
}
return true;
}
}
catch(Exception &e)
{
s = "函数SelectListDir(AnsiString dir)错误,遍历文件夹时失败,请检查!!\n" + e.Message;;
ts = "提示:";
Application->MessageBoxA(s.c_bstr(),ts.c_bstr(),MB_OK+16);
}
}