Delphi TIdFTP。列表需要很多时间
以下代码:Delphi TIdFTP。列表需要很多时间,delphi,ftp,indy,Delphi,Ftp,Indy,以下代码: ftp := TIdFTP.Create(nil); try ftp.Host := _settings.IP; ftp.Port := _settings.Port; ftp.Username := _settings.UserName; ftp.Password := _settings.Password; ftp.ConnectTimeout := 3000; ftp.TransferType := f
ftp := TIdFTP.Create(nil);
try
ftp.Host := _settings.IP;
ftp.Port := _settings.Port;
ftp.Username := _settings.UserName;
ftp.Password := _settings.Password;
ftp.ConnectTimeout := 3000;
ftp.TransferType := ftBinary;
_log(Format('Connecting FTP server at %s, port %d', [ftp.Host, ftp.Port]));
ftp.Connect();
_log('Connected');
if _isDestroying then Exit;
try
ftp.ChangeDir(_settings.Path);
except
on E: EIdReplyRFCError do begin _logError(Format('Could not change to %s directory', [_settings.Path])); Exit; end;
end;
if _isDestroying then Exit;
ftp.List();
完美运行,直到FTP目录中的文件数量不超过1500
现在运行ftp.List()需要很长时间代码>行。老实说,我没看到它一直跑到最后
是的,设备的嵌入式FTP服务器性能不佳:
Win7的内置FTP客户端(FTP.exe
)很快完成运行ls
命令,但当某些软件(我的应用程序中的TIdFTP或Far Manager中的NetBox)同时读取文件列表时,FTP.exe
工具中的ls
命令运行得慢得多
是否有任何方法可以像ftp.exe那样快速获取文件列表,然后解析列表?或者可以异步获取列表项。如果另一个应用程序存在相同的问题,则听起来更像是服务器实现的问题。也许连接的方法不同。我对FTP很模糊(我几年前就放弃了它),但我知道连接和使用它的方法不止一种。如果切换此方法,您可能会找到所需的行为。ftp.exe
不解析列表,它只显示服务器发送的内容。如果FTP服务器不支持MLST命令,则列表可以是服务器想要的任何格式TIdFTP
(和其他解析器)必须猜测该格式是什么。猜测可能需要时间。但是,TIdFTP
在退出List
后访问DirectoryListing
属性后才会进行分析List
本身只是下载原始数据并将其存储在ListResult
属性中,因此它应该接近服务器发送数据的速度。除非速度缓慢是由于ListResult
处理造成的,而不是实际下载。好的,Indy很好,FTP服务器有问题,但是除了从FTP服务器删除文件之外,我现在能做什么?将文件放在子目录结构中。无论如何,您都不想一次向用户显示1500多个文件。如果其他应用程序有相同的问题,听起来更像是服务器实现的问题。也许连接的方法不同。我对FTP很模糊(我几年前就放弃了它),但我知道连接和使用它的方法不止一种。如果切换此方法,您可能会找到所需的行为。ftp.exe
不解析列表,它只显示服务器发送的内容。如果FTP服务器不支持MLST命令,则列表可以是服务器想要的任何格式TIdFTP
(和其他解析器)必须猜测该格式是什么。猜测可能需要时间。但是,TIdFTP
在退出List
后访问DirectoryListing
属性后才会进行分析List
本身只是下载原始数据并将其存储在ListResult
属性中,因此它应该接近服务器发送数据的速度。除非速度缓慢是由于ListResult
处理造成的,而不是实际下载。好的,Indy很好,FTP服务器有问题,但是除了从FTP服务器删除文件之外,我现在能做什么?将文件放在子目录结构中。无论如何,您都不想一次向用户显示1500多个文件。