我用
      IdFTP1.Host:='127.0.0.1';  
      IdFTP1.Username:='user';
      IdFTP1.Password:='user';
      IdFTP1.Connect(true,-1);
      IdFTP1.Get('123.txt','d:/123.txt',true);
只能复制单个文件,
如何能复制某个指定文件夹里的所有文件啊?翻了以前很多的帖子,说的模模糊糊的,有人能指点下吗?

解决方案 »

  1.   

    那就获得那个文件夹的文件列表,循环调用IdFTP1.Get
      

  2.   


     for j:=0 to IdFTP1.DirectoryListing.Count-1 do
     begin
         LFileName:=IdFTP1.DirectoryListing.Items[j].FileName;
         IdFTP1.Get(LFileName,本地文件名,true); 
     end;
      

  3.   

    给你段代码参考一下:procedure TForm1.FTP_DownloadDir(RemoteDir, LocalDir: string);
    label
      Files;
    var
      i, DirCount: integer;
      ss, tt, LogFile: string;
      ftpModifyDate, FileModifyDate: TDateTime;
      IsNeedDownLoad: Boolean;
    begin
      LogFile := LocalDir + 'AutoUpdate.log';
      Label4.Caption := '远程文件夹:' + RemoteDir;
      if UpperCase(RemoteDir) <> UpperCase(FTP_SOFTPATH) then
      begin
        if not DirectoryExists(LocalDir + RemoteDir) then
          ForceDirectories(LocalDir + RemoteDir);
      end;
      idFTP1.ChangeDir(RemoteDir);
      Application.ProcessMessages;
      idFTP1.List(nil);
      DirCount := idFTP1.DirectoryListing.Count;
      if DirCount = 0 then
      begin
        idFTP1.ChangeDirUp;
        idFTP1.List(nil);
        Application.ProcessMessages;
      end;
      for i := 0 to DirCount - 1 do
      begin
        ss := idFTP1.DirectoryListing[i].FileName;
        ftpModifyDate := idFTP1.DirectoryListing[i].ModifiedDate;
        if DirCount <> idFTP1.DirectoryListing.Count then
        begin
          repeat
            idFTP1.ChangeDirUp;
            idFTP1.List(nil);
            Application.ProcessMessages;
          until DirCount = idFTP1.DirectoryListing.Count;
        end;
        if idFTP1.DirectoryListing[i].ItemType = ditDirectory then
        begin
          if (ss <> '.') and
            (ss <> '..') then
          begin
            if UpperCase(RemoteDir) <> UpperCase(FTP_SOFTPATH) then
            begin
              FTP_DownloadDir(ss, LocalDir +
                RemoteDir + '\');
            end
            else
              FTP_DownloadDir(ss, LocalDir);
          end;
        end
        else
        begin
          if UpperCase(RemoteDir) <> UpperCase(FTP_SOFTPATH) then
            label2.Caption := LocalDir + RemoteDir +
              '\' + ss
          else
            label2.Caption := LocalDir + ss;
          BytesToTransfer := IdFTP1.Size(ss);
          if UpperCase(ss) = 'AUTOUPDATE.EXE' then
            tt := 'AutoUpdate.new'
          else
            tt := ss;
          if UpperCase(RemoteDir) <> UpperCase(FTP_SOFTPATH) then
            FileModifyDate := GetFileModifyDate(LocalDir + RemoteDir + '\' + tt)
          else
            FileModifyDate := GetFileModifyDate(LocalDir + tt);
          if FileModifyDate < ftpModifyDate then
            IsNeedDownLoad := True;
          if IsNeedDownLoad then
          begin
            if not IsFileInUse(tt) = True then
            begin
              try
                WriteLogFile(Format('%s下载文件:%s(本地文件日期:%s,远程文件日期:%s)',
                  [FormatDateTime('YYYY-MM-DD HH:MM:SS:ZZZZ ', Now()), ss,
                  FormatDateTime('YYYY-MM-DD HH:MM:SS:ZZZZ', FileModifyDate),
                    FormatDateTime('YYYY-MM-DD HH:MM:SS:ZZZZ', ftpModifyDate)]),
                    LogFile);
                if UpperCase(RemoteDir) <> UpperCase(FTP_SOFTPATH) then
                  idFTP1.Get(ss, LocalDir + RemoteDir + '\' + tt, true)
                else
                  idFTP1.Get(ss, LocalDir + tt, true);
              except
                on E: Exception do
                begin
                  ErrMsg(E.Message);
                end;
              end;
            end;
          end;
          Application.ProcessMessages;
          if i = DirCount - 1 then
          begin
            idFTP1.ChangeDirUp;
            idFTP1.List(nil);
            Application.ProcessMessages;
          end;
        end;
      end;
    end;