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多个文件。