我在使用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图像)。
对此异常的含义有什么想法吗?
由于
答案 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)'和子目录作为数据文件的存储。