簡體   English   中英

從遠程FTP下載文件列表

[英]Downloading list of files from remote FTP

我在使用TidFTP組件時遇到了問題。

我可以使用這樣的代碼連接服務器

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

從元素序列中獲取多個文件后(這個元素正好有778個元素)。 檢索到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導致在Indy論壇中的這個討論:

在TIdFTP(client)中使用HOST => EIdAcceptTimeout

Remy Lebeau在哪里說:

數據傳輸期間唯一可能發生異常的情況是,如果您將TIdFTP.Passive屬性設置為False,則告知FTP服務器與TIdFTP建立入站連接。 這些連接通常被不支持FTP的防火牆/路由器阻止。 當您在防火牆/路由器后面時,通常必須設置TIdFTP.Passive = True。

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

oClientFTP.Passive := True;

順便說一句。 在您的代碼片段中,您同時擁有oClientFTP和oClienteFTP。 如果需要,調整我的建議。

我會把它寫成評論,而不是答案,但評論太有限了。 如果我行為不端,請告訴我並原諒我。

再看一下你的代碼會引發一些問題。 我看到StringList可以有兩個文件(posPoint <> 0)和大概目錄(posPoint = 0)。 元素137是文件或目錄,如果是文件,它是新目錄之后的第一個文件嗎?

StringList中的條目是否包含'\\ backup \\后應該具有的路徑?

假設您的應用程序是Windows應用程序(因為您沒有另外說明),當您創建新路徑時,為什么使用正斜杠(/)而不是反斜杠(),這是Windows上的路徑分隔符? 您的代碼甚至在Windows上創建子目錄嗎? 好吧,也許跨平台Delphi根據操作系統進行調整。

在oClienteFTP.Get語句中,即使您已在“/ backup /”中使用斜杠作為尾隨分隔符,也要說IncludeTrailingPathDelimiter。

您永遠不應再使用'ExtractFilePath(Application.ExeName)'和子目錄作為數據文件的存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM