下载目录,要考虑到子目录文件的下载。可以编写一个递归函数搜索下载。

解决方案 »

  1.   

    procedure Tmainform.download ;
    var
      name:string;
      tt :TIdFTPListItems; //ftp列表
      t : TIdFTPListItem;  //ftp单条记录
      j,f:Integer;
      ls:TStringList ;
    begin
        if idftp.Connected =False then btn1.Click;
            //idftp.ChangeDir('/Ext');
            ls := TStringList.Create;
          try
            idftp.ChangeDir('/Ext');
            idftp.ChangeDir(ip.Text);
            idftp.ChangeDir(ftp_date.Text);
            edt1.Text := IdFTP.RetrieveCurrentDir;
            idftp.List(ls);  //这句很关键啊,一个晚上就是发现该语句必须放在进入目录之后的第一件事情。
            f:=idftp.DirectoryListing.Count-1 ;
            {
            if Trim(ip.Text)='255.255.8.80' then
            begin
            ShowMessage(IntToStr(f));
            end;
                  on e: Exception do
          Begin
            log4error(PChar(E.Message)+'_连接超时');
          End;
            }
          except
            on e: Exception do
            begin
            log4error(PChar(E.Message)+'_改变目录错误');
            mmo1.Lines.Add(PChar(E.Message));
            mmo1.Lines.Add(ip.Text+'_'+ftp_date.Text+'无数据');
            fun_ftplog( ip.text,ftp_date.Text,'0');
            Exit;//没有会出现list index out of bounds 错误
            f:=0;
            end;      end;      //IdFTP.TransferType := ftBinary;
          tt:=IdFTP.directorylisting;
          forcedirectories ('.\'+ip.text+'\'+ftp_date.Text);
          for j :=0  to f   do
          begin
            t:=tt.items[j];
            if (IdFTP.DirectoryListing.Items[j].ItemType = ditfile) and (f>0) then //如果是文件
            begin
              if Length(t.FileName)<11   then name :='data.txt'
              else name:=t.FileName;
              try
               IdFTP.Get(t.FileName ,ip.text+'\'+ftp_date.Text+'\'+name,True,False);
              except              on e: Exception do
                  Begin
                    mmo1.Lines.Add(PChar(E.Message)+name);
                    log4error(PChar(E.Message)+'_下载失败');
                    mmo1.Lines.Add(name+'_'+'下载失败');
                  End;        end;
          end;
        //mmo1.Lines.Add(ip.text+'_'+ftp_date.Text+'下载完毕');
        mmo2.Lines.Add(ip.text+'_'+ftp_date.Text+'='+inttostr(f)+'下载完毕');
        fun_ftplog( ip.text,ftp_date.Text,inttostr(f));
        idftp.ChangeDir('../');
        idftp.ChangeDir('../');
        idftp.ChangeDir('../');
    end;
    end;