2017-07-12 46 views
0

我嘗試從我們的服務器下載文件的idFTP Indy組件有問題。它下載99%的文件,然後掛起。 GET語句不返回。最近發生的變化是,我們已經從運行win 8.1的桌面移動到運行win10的筆記本電腦。如果我將進度和完整文件大小寫入屏幕,它會很快下載,直到最後,最後一個字節沒有完成。我試圖下載的文件是15,573,350字節。它達到大約14MB(相當快)並停止。我試過下載另一個文件,這是同樣的事情。在Delphi XE6中FTP GET()語句在下載完成後不會返回

任何想法?

這是代碼,沒有什麼奇特的。我從我們的工作應用程序中複製它,嘗試並測試它,看看它是否在主項目中。

with IdFTP1 do 
    begin 
    Host := 'xxx'; 
    Username := 'xxx'; 
    Password := 'xxx'; 
    passive := True; 
    Connect; 
    ChangeDir('Service_Update'); 
    ChangeDir('QA'); 
    Self.Caption := Size('jam.zipper').tostring; 
    TransferType := ftBinary; //tried with and without 
    Get('jam.zipper','jam.zipper',true); 
    Button1.Caption := 'Done'; //never gets here 
    end; 

回答

0

Get()有很多方法可以像您所描述的那樣凍結。一些方法包括:

  1. 服務器不收端部的傳遞連接擺好,或傳輸結束後的服務器沒有在命令連接上發送一個最終FTP響應消息。使用數據包嗅探器進行驗證。要處理這個問題,請嘗試在命令和傳輸連接上分配一個非無限的ReadTimeout

  2. 如果FTP會話通過不支持FTP的路由器/防火牆,則命令連接可能會超時並在長時間傳輸過程中被丟棄。爲了解決這個問題,TIdFTP有一個NATKeepAlive屬性來在傳輸過程中在命令連接上配置TCP保持活動。

  3. 如果您在帶有事件處理程序的工作線程中使用TIdFTP,這些事件處理程序會對UI控件進行非同步調用,這可能會導致各種問題,包括死鎖。始終將訪問權限同步到UI。

+0

謝謝雷米。讓我感到癢的是服務器沒有任何改變。下載功能一直有效 - 直到我在win 10上發現它現在沒有了。你認爲這可能會有所作爲嗎? 對於第3點,我確實使用了一個線程。但是,我的實際工作代碼與我在此共享的演示程序行爲相同。它很快下載一切,然後在最後不做任何事情...... –

+0

好吧,事實證明我錯了。我回到贏得8.1重新測試這是同樣的問題。必須意味着在服務器端發生了一些變化,我現在會調查一下...... –