2017-07-12 17 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重新测试这是同样的问题。必须意味着在服务器端发生了一些变化,我现在会调查一下...... –