2014-11-21 3 views
3

TidFTP 구성 요소를 사용하는 데 문제가 있습니다.원격 FTP에서 파일 목록 다운로드

나는 (이 정확히 778 요소가 있습니다)을 StringList에서 여러 파일을받은 후이

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

같은 코드를 사용하여 서버에 연결할 수있을 때 요소 없음. 137가 검색되면 EIdAcceptTimeout이 "Accept timed out"으로 발생합니다. 메시지.

내가 (그런데 스레드에서 실행)이처럼 실행 코드

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 이미지 다운로드).

이 예외의 의미에 대해 알고 싶습니다.

감사 인디 포럼이 토론 EIdAcceptTimeout 리드에 대한 인터넷 검색을

+0

시간 초과는 TCP/IP 네트워킹의 표준 개념입니다. TCP 시간 초과가 무엇인지 정말로 묻고 있습니까? FTP 연결의 컨텍스트에서 ACCEPT는 서버 측에서 되돌아 오는 것으로 가정되며 그렇지 않습니다. 지금해야 할 일은 당신에게 달려 있습니다. 모든 것을 중단하고 파일을 건너 뛰고 다음 파일을 가져오고 해당 파일을 3 번 다시 시도한 후 다음 파일로 이동하십시오. 당신이 결정합니다. 이 FTP 구성 요소는 파일 전송 솔루션의 한 단계에 불과하며 네트워크에 장애가 발생했을 때 수행 할 작업을 결정하지 않습니다. 항상 수행 할 수 있습니다. –

답변

9

:

UseHOST in TIdFTP (client) => EIdAcceptTimeout

레미 Lebeau은 상태 :

유일한 시간은 예외는 동안 발생할 수 있습니다 데이터 전송은 인 경우 TIdFTP.Passive 속성을 False로 설정하면 FTP에 알려줍니다. 서버가 TIdFTP에 인바운드 연결을 설정합니다. 이러한 연결은 보통 FTP를 인식하지 못하는 방화벽/라우터에 의해 차단되는 입니다. 방화벽/라우터 이면 보통 TIdFTP.Passive = True로 설정해야합니다. 당신이 Btw은 선

oClientFTP.Passive := True; 

를 추가 할 수

그래서, 솔루션이 될 수 있습니다. 코드 스 니펫에는 oClientFTP와 oClienteFTP가 있습니다. 필요한 경우 제안 내용을 조정하십시오.

+4

더 나은 자신을 말할 수 없었다 :) –

1

나는 대답이 아닌 주석으로 작성했지만 주석은 너무 제한적입니다. 내가 잘못했을 경우 알려 주시고 변명하십시오.

코드를 살펴보면 몇 가지 질문이 제기됩니다. StringList는 두 파일 (posPoint <> 0)과 아마도 디렉토리 (posPoint = 0)를 모두 가질 수 있습니다. 요소 137은 파일 또는 디렉토리이고 파일 인 경우 새 디렉토리 다음의 첫 번째 파일입니까?

StringList의 항목에 '\ backup \?'뒤에 있어야 할 경로가 포함되어 있습니까?

새 경로를 만들 때 Windows에서 응용 프로그램을 사용한다고 가정 할 때 Windows에서 경로 구분 기호 인 백 슬래시() 대신 슬래시 (/)를 사용하는 이유는 무엇입니까? 귀하의 코드가 심지어 Windows에서 하위 디렉토리를 생성합니까? 음, 어쩌면 크로스 플랫폼 델파이는 OS에 따라 조정됩니다.

oClienteFTP.Get 문에서 '/ backup /'의 후행 구분 기호로 이미 슬래시가있는 경우에도 IncludeTrailingPathDelimiter라고 말합니다.

데이터 파일의 저장소로 'ExtractFilePath (Application.ExeName)'및 하위 디렉터리를 더 이상 사용하지 않아야합니다.

관련 문제