indy idftp的使用,为何会导致程序不响应(200分)

  • 主题发起人 主题发起人 vample
  • 开始时间 开始时间
V

vample

Unregistered / Unconfirmed
GUEST, unregistred user!
从定时从ftp服务器上取一个文本文件 1.txt 下载到本地硬盘上使用
用的是indy idftp控件,每次取文件都是
try
IdFTP.Disconnect;
IdFTP.Connect;
IdFTP.ChangeDir(S_Dir);
IdFTP.TransferType := ftBinary;
IdFTP.Get(SourceFile, DestFile, true);
IdFTP.abort;
IdFTP.Disconnect;
except
IdFTP.abort;
IdFTP.Disconnect;
end;

为何程序启动没有问题,取文件也没问题。程序可以正常运行2-3个小时,取文件读文件没问题。可是超过2-3小时,程序就会停止响应,也没异常抛出,必须重起程序,才能正常运行。1.txt变成空文本,不让删除,说有程序正在使用。
怀疑如下:
1、IdFTP.Get(SourceFile, DestFile, true)的时候如果网络异常,是否会导致程序不响音
2、ftp服务器上的文本是定时更新的,如ftp服务器更新1.txt文本的时候,程序取IdFTP.Get(SourceFile, DestFile, true),导致程序停止响应
3、下载后的文件是程序计算用的,如果本机器1.txt文件正在使用的时候,下载1.txt覆盖本机1.txt会导致程序停止响应

另外:如何取ftp服务器上1.txt文本的更新时间





 
第一种情况下,应该会抛出异常.
第二种情况下,也应该会抛出异常.
第三种情况下,当然也会抛出异常.
我认为,没有响应的原因在于,你是用的主动模式,在这种模式下,收文件的"数据通道"的服务器端设在本机,而服务器却成为"数据通道"的客户端,如果它响应不过来,就不再连接客户端,从而造成客户端接收线程处于"死线程"状态,因为它在不停地检查有没有连接过来.
要解决这个问题,有两种方法:
(1)将ftp设为被动模式.即IdFtp1.passive:=True; (前提是服务器支持这种模式)
(2)新开一个线程用来接收文件,并且设置一个超时处理.

另外:如何取ftp服务器上1.txt文本的更新时间?
就ftp协议而言,没有关于文件的最后修改时间的获取命令. 如果是你自己的服务器,你可自行扩充,加多一个命令支持就可以了,如果不是自己的服务器,那你可以把最后修改时间作为文件的内容添加在文件里,下载后再自行分析.

 
是不是多次连接的问题
我每次都是现断开连接,再连接服务器,去完数据后,断开连接
而且取数据的频率很高,大概1分钟一次,这样可能连接次数多了,
就停止响应了
 
后退
顶部