Downloading list of files from remote FTP

☆樱花仙子☆ 提交于 2020-01-04 02:44:27

问题


I'm getting a problem using the TidFTP component.

I'm able to connect with the server using a code like this

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

After getting several files from the StringList (this one has exactly 778 elements) when the element no. 137 is retrieved the exception EIdAcceptTimeout is raised with "Accept timed out." message.

The code that I run is like this (runs in a Thread by the way)

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;

After the exception, the file is downloaded correctly but the process needs like 25 seconds per file (I'm downloading 2KB png images).

Any idea of the meaning of this Exception?

Thanks


回答1:


Googling for EIdAcceptTimeout leads to this discussion in the Indy forum:

UseHOST in TIdFTP (client) => EIdAcceptTimeout

Where Remy Lebeau states:

The only time that exception can occur during a data transfer is if you have the TIdFTP.Passive property set to False, which tells the FTP server to make an inbound connection to TIdFTP. Those connections are usually blocked by firewalls/routers that are not FTP-aware. You usually have to set TIdFTP.Passive=True when you are behind a firewall/router.

So, the solution could be for you to add a line

oClientFTP.Passive := True;

Btw. In your code snippets you have both oClientFTP and oClienteFTP. Adjust my suggestion if needed.




回答2:


I would have written this as comments, rather than an answer, but comments are too limited. Please let me know and excuse me if I misbehave.

Looking at your code a second time raises a few questions. I see that the StringList can have both files (posPoint <> 0) and presumably directories (posPoint = 0). Is element 137 a file or directory and if a file, is it the first file after a new directory?

Do the entries in the StringList include the path they ought to have after '\backup\?

Assuming your application is a Windows application (since you don't say otherwise), When you create new paths, why do you use forward slashes (/) instead of backslashes () which is the path delimiter on Windows? Does your code even create subdirectories on Windows? Well, maybe crossplatform Delphi adjusts according to OS.

In the oClienteFTP.Get statement you say IncludeTrailingPathDelimiter even if you already have a slash as the trailing delimiter in '/backup/'.

You should never anymore use 'ExtractFilePath(Application.ExeName)' and subdirectories, as storage for data files.



来源:https://stackoverflow.com/questions/27063187/downloading-list-of-files-from-remote-ftp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!