[英]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.