从远程FTP下载文件列表

时间:2014-11-21 14:06:33

标签: delphi ftp delphi-xe2 indy

我在使用TidFTP组件时遇到了问题。

我可以使用像这样的代码连接服务器

vFileList := TStringList.Create;
oClientFTP := TidFTP.Create(nil);
oClientFTP.Port := PortFTP;
oClientFTP.Host := IPHost;
oClientFTP.UserName := UserFTP;
oClientFTP.Password := PasswordFTP;

从元素序列中获取多个文件后(这个元素正好有778个元素)。检索到137,异常EIdAcceptTimeout引发"接受超时。"消息。

我运行的代码是这样的(顺便在线程中运行)

procedure TDownloadFTP.Get;
begin
try
  for I := 0 to vFileList .Count - 1 do
  begin
    sFileName:= vFileList [I];
    posPoint := LastDelimiter('.', sFileName);
    if posPoint = 0 then
      ForceDirectories(ExtractFilePath(Application.ExeName) + '/BackUp/' + sFileName)
    else
      try
        oClienteFTP.Get(sFileName,IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName) + '/BackUp/') + sFileName, True);
    except

      on E: EIdReplyRFCError do
      begin
      end;
      on E: Exception do
        exceptionList.Add(sFileName);
  end;
end;

异常后,文件正确下载,但每个文件的过程需要25秒(我下载2KB png图像)。

对此异常的含义有什么想法吗?

由于

2 个答案:

答案 0 :(得分:9)

Google搜索EIdAcceptTimeout会在Indy论坛中进行讨论:

UseHOST in TIdFTP (client) => EIdAcceptTimeout

Remy Lebeau说:

  

在数据传输期间唯一可能发生异常的时间是if   您将TIdFTP.Passive属性设置为False,它告诉FTP   服务器与TIdFTP建立入站连接。这些联系是   通常被不支持FTP的防火墙/路由器阻止。您   当你落后时,通常必须设置TIdFTP.Passive = True   防火墙/路由器。

因此,解决方案可能是您添加一行

oClientFTP.Passive := True;

顺便说一下。在您的代码片段中,您同时拥有oClientFTP和oClienteFTP。如果需要,请调整我的建议。

答案 1 :(得分:1)

我会把它写成评论,而不是答案,但评论太有限了。如果我行为不端,请告诉我并原谅我。

再次查看您的代码会引发一些问题。我看到StringList可以有两个文件(posPoint<> 0)和大概目录(posPoint = 0)。元素137是文件或目录,如果是文件,它是新目录之后的第一个文件吗?

StringList中的条目是否包含'\ backup \?

之后应该具有的路径

假设您的应用程序是Windows应用程序(因为您没有另外说明),在创建新路径时,为什么使用正斜杠(/)而不是反斜杠(),它是Windows上的路径分隔符?您的代码甚至在Windows上创建子目录吗?好吧,也许跨平台Delphi根据操作系统进行调整。

在oClienteFTP.Get语句中,即使你已经在'/ backup /'中有一个斜杠作为尾随分隔符,你也会说IncludeTrailingPathDelimiter。

您永远不应再使用'ExtractFilePath(Application.ExeName)'和子目录作为数据文件的存储。