下面这一小段Delphi写的程序转为CBuilder下的,大家帮忙看看写的对不对?(Delphi不熟悉,拜托了!)

sniper27 2008-05-14 04:04:49
{ 下载整个目录,并遍历所有子目录首先 ChangeDir(Root) 到根目录然后创建本地目录 + RemoteDir然后用 list 得到所有目录名循环判断,进入 RemoteDir 目录内部如果是目录继续第归。否则 get 该文件到本地目录,当 get 完所有文件后返回上一级目录用List再取得信息,继续循环}
Procedure FTP_DownloadDir(var idFTP : TIdFtp;RemoteDir,LocalDir : string);
label Files ;
var
i,DirCount : integer;
begin
if not DirectoryExists(LocalDir + RemoteDir) then
ForceDirectories(LocalDir + RemoteDir);
idFTP.ChangeDir(RemoteDir);
idFTP.List(nil);
DirCount := idFTP.DirectoryListing.Count ;
if DirCount = 0 then
begin
idFTP.ChangeDirUp;
idFTP.List(nil);
end;
for i := 0 to DirCount - 1 do
begin
if DirCount <> idFTP.DirectoryListing.Count then
begin
repeat
idFTP.ChangeDirUp;
idFTP.List(nil);
until DirCount = idFTP.DirectoryListing.Count ;
end;

if idFTP.DirectoryListing[i].ItemType = ditDirectory then
FTP_DownloadDir(idFTP,idFTP.DirectoryListing[i].FileName,LocalDir + RemoteDir + '\')
else begin
idFTP.Get(idFTP.DirectoryListing[i].FileName,LocalDir + RemoteDir + '\' +
idFTP.DirectoryListing[i].FileName,true);
Form1.lb_num.Caption := IntToStr(StrToInt(Form1.lb_num.Caption) + 1);
Form1.lb_num.Update;

if i = DirCount - 1 then
begin
idFTP.ChangeDirUp;
idFTP.List(nil);
end;
end;
end;
end;

//-------------------------------------------------------------------------------------------------
转换为CBuilder的程序如下:
bool __fastcall FTP_DownLoadThread::FTP_DownloadDir(AnsiString RemoteDir,AnsiString LocalDir,TIdFTP *idFtp)
{
int i,DirCount;
AnsiString RemoteFileName,tempRemoteDir;
bool Result=true;
TStringList *Ls=new TStringList();
try
{
if (!DirectoryExists(LocalDir +"\\"+RemoteDir))//判断本地是否存在对应路径
ForceDirectories(LocalDir +"\\"+RemoteDir); //如果不存在就创建
idFtp->ChangeDir(RemoteDir);//进入远端服务器目录
idFtp->List(Ls);//列出远端服务器目录
DirCount=idFtp->DirectoryListing->Count;//统计文件和文件夹的个数
if(DirCount== 0)
{
idFtp->ChangeDirUp();
idFtp->List(Ls);
}
for(i=0;i <DirCount;i++)
{
while(DirCount!=idFtp->DirectoryListing->Count)
{
idFtp->ChangeDirUp();
idFtp->List(Ls);
}
if (idFtp->DirectoryListing->Items[i]->ItemType == ditDirectory)
{
FTP_DownloadDir(idFtp->DirectoryListing->Items[i]->FileName,LocalDir +"\\"+ RemoteDir ,idFtp);//如果是目录,继续递归
}
else//如果是文件,则下载!
{
idFtp->TransferType = ftBinary;
idFtp->Get(idFtp->DirectoryListing->Items[i]->FileName,LocalDir+"\\"+ RemoteDir + "\\" +idFtp->DirectoryListing->Items[i]->FileName,true);//下载文件
Form1->Memo1->Lines->Add("影像文件"+idFtp->DirectoryListing->Items[i]->FileName+"下载完毕!");
}
if(i == DirCount-1)
{
if(tempRemoteDir!=idFtp->RetrieveCurrentDir())
{
idFtp->ChangeDirUp();
idFtp->List(Ls);
}
}
}
}
catch(Exception &e )
{
Result=false;
}
return Result;
}


...全文
132 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sniper27 2008-05-15
  • 打赏
  • 举报
回复
兄弟别光顶啊,帮忙看看啊,感激不尽啊~~
laowang2 2008-05-15
  • 打赏
  • 举报
回复
upup
sniper27 2008-05-14
  • 打赏
  • 举报
回复
好的,我再试试,不过我现在的程序问题是,下载几百兆的没问题,但是下载大文件,上G的话就会出问题,总是下不全,不知到底是何故啊~~
僵哥 2008-05-14
  • 打赏
  • 举报
回复
那直接使用idFTP->List();试试看。
sniper27 2008-05-14
  • 打赏
  • 举报
回复
不好意思,我没结贴,因为问题还没解决,感谢你~~适当时候我会把分给你的~~多谢啊
sniper27 2008-05-14
  • 打赏
  • 举报
回复
谢谢,非常感谢!不过这句
//idFTP.List(nil);
idFTP->List(NULL);
好像在CBuilder中不行~~它好像需要TStringList *Ls=new TStringList(); 然后idFtp->List(Ls);大侠可曾对着TIDFTP有研究??
僵哥 2008-05-14
  • 打赏
  • 举报
回复
//Procedure FTP_DownloadDir(var idFTP : TIdFtp;RemoteDir,LocalDir : string);
//label Files ;
void __fastcall FTP_DownloadDir(TIdFtp* &idFTP,AnsiString RemoteDir,AnsiString LocalDir){
//var
//i,DirCount : integer;
int i,DirCount;
//begin
//if not DirectoryExists(LocalDir + RemoteDir) then
//ForceDirectories(LocalDir + RemoteDir);
if(!DirectoryExists(LocalDir + RemoteDir)
ForceDirectories(LocalDir + RemoteDir);
//idFTP.ChangeDir(RemoteDir);
idFTP->ChangeDir(RemoteDir);
//idFTP.List(nil);
idFTP->List(NULL);
//DirCount := idFTP.DirectoryListing.Count ;
DirCount = idFTP->DirectoryListing->Count;
//if DirCount = 0 then
if(!DirCount)
//begin
{
//idFTP.ChangeDirUp;
idFTP->ChangeDirUp();
//idFTP.List(nil);
idFTP->List(NULL);
//end;
}
//for i := 0 to DirCount - 1 do
for(i = 0; i < DirCount; i++)
//begin
{
//if DirCount <> idFTP.DirectoryListing.Count then
if (DirCount != idFTP->DirectoryListing->Count)
//begin
{
//repeat
do {
//idFTP.ChangeDirUp;
idFTP->ChangeDirUp();
//idFTP.List(nil);
idFTP->List(NULL);
//until DirCount = idFTP.DirectoryListing.Count ;
}while (DirCount != idFTP->DirectoryListing->Count);
//end;
}

//if idFTP.DirectoryListing[i].ItemType = ditDirectory then
if(idFTP->DirectoryListing->Items[i]->ItemType == ditDirectory)
//FTP_DownloadDir(idFTP,idFTP.DirectoryListing[i].FileName,LocalDir + RemoteDir + '\')
FTP_DownloadDir(idFTP, idFTP->DirectoryListing->Items[i]->FileName, LocalDir + RemoteDir + "\\");
//else begin
else {
//idFTP.Get(idFTP.DirectoryListing[i].FileName,LocalDir + RemoteDir + '\' +
idFTP->Get(idFTP->DirectoryListing->Items[i]->FileName, LocalDir + RemoteDir + "\\" +
//idFTP.DirectoryListing[i].FileName,true);
idFTP->DirectoryListing->Items[i]->FileName, true);
//Form1.lb_num.Caption := IntToStr(StrToInt(Form1.lb_num.Caption) + 1);
Form1->lb_num->Caption = IntToStr(StrToInt(Form1->lb_num->Caption) + 1);
//Form1.lb_num.Update;
Form1->lb_num->Update();

//if i = DirCount - 1 then
if(i == DirCount - 1)
//begin
{
//idFTP.ChangeDirUp;
idFTP->ChangeDirUp();
//idFTP.List(nil);
idFTP->List(NULL);
//end;
}
//end;
}
//end;
}
//end;
}

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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