【问题标题】:Downloading list of files from remote FTP从远程 FTP 下载文件列表
【发布时间】:2014-11-21 14:06:33
【问题描述】:

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

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

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

从StringList中得到几个文件后(这个正好有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 图像)。

知道这个异常的含义吗?

谢谢

【问题讨论】:

  • 超时是 TCP/IP 网络中的一个标准概念。你真的在问什么是 TCP 超时吗?在 FTP 连接的上下文中,ACCEPT 应该从服务器端返回,但它没有。现在做什么取决于你。中止整个过程,跳过文件,然后尝试获取下一个文件,重试该文件 3 次,然后转到下一个文件。你决定。此 FTP 组件只是文件传输解决方案的一个级别,它不会为您决定当网络出现故障时该怎么做,而它始终可以。

标签: delphi ftp delphi-xe2 indy


【解决方案1】:

在 Google 上搜索 EIdAcceptTimeout 会导致 Indy 论坛中的此讨论:

UseHOST in TIdFTP (client) => EIdAcceptTimeout

Remy Lebeau 所说的:

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

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

oClientFTP.Passive := True;

顺便说一句。在您的代码 sn-ps 中,您同时拥有 oClientFTP 和 oClienteFTP。如果需要,调整我的建议。

【讨论】:

  • 我自己说得再好不过了 :)
【解决方案2】:

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

再次查看您的代码会引发一些问题。我看到 StringList 可以同时包含文件(posPoint 0)和可能的目录(posPoint = 0)。元素 137 是文件还是目录,如果是文件,它是新目录之后的第一个文件吗?

StringList 中的条目是否包含它们在 '\backup\ 之后应该具有的路径?

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

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

您不应再使用“ExtractFilePath(Application.ExeName)”和子目录作为数据文件的存储空间。

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 2013-09-25
    • 2014-08-05
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    相关资源
    最近更新 更多