【问题标题】:Getting all FTP directory/file listings recursively in one call一次调用递归获取所有 FTP 目录/文件列表
【发布时间】:2018-05-20 19:46:31
【问题描述】:

我正在创建一个将数据备份到 FTP 的备份程序。为了有效存档,我需要做几个文件属性比较。现在,我正在使用FluentFTP 并调用FtpClient.FileExists FtpClient.GetFileSizeFtpClient.GetModifiedTime 每个文件。这显然不是很理想。

如果我可以在一次调用中下载 FTP 目录的整个树结构以及文件属性,它将大大提高备份速度。另一种方法是建立一个本地索引,但我必须确保它被正确更新并考虑到它被损坏的可能性。

除了推出我自己的解决方案之外,还有其他方法吗?

【问题讨论】:

    标签: .net ftp fluentftp


    【解决方案1】:

    FTP 提供这些命令来检索有关远程文件的信息:

    • NLST 检索特定目录中的文件名 - 所有服务器都支持。
    • SIZEMDTM 检索特定文件的大小和修改文件 - 几乎所有服务器都支持。
    • LIST 检索目录列表,包括文件属性 - 所有 服务器都支持,但列表不是标准化的,因此不是真正的机器可读。尽管大多数服务器将支持 *nix 样式列表(如 *nix ls 命令)。虽然每个人都有自己的怪癖。
    • MLSD 检索目录列表,包括机器可读格式的文件属性 - 最不支持此命令。 *nix vsftpd 和 Windows IIS 尤其不支持它。

    因此您不必使用FtpClient.GetFileSizeFtpClient.GetModifiedTime 每个文件每个目录使用FtpClient.GetListing。如果服务器支持,它在内部使用MLSD。否则它会退回到LIST 并尝试解析列表。


    某些 FTP 服务器(如 ProFTPD)确实支持非标准的专有 -R 切换到 LIST 命令,这将使它们返回所有子文件夹的列表。 FluentFTP 也支持 (FtpListOption.Recursive)。但请注意,FluentFTP 仅使用 -RLIST,而如果服务器支持,它更喜欢使用 MLSD。因此,要确保使用LIST -R,您需要同时使用FtpListOption.RecursiveFtpListOption.ForceList

    如果您的服务器不支持-R 开关,您必须自己实现递归。或者使用具有 API 的 FTP 客户端。

    例如myWinSCP .NET assembly,你可以使用Session.EnumerateRemoteFiles

    IEnumerable<RemoteFileInfo> allFiles =
        session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);
    

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2012-11-23
      • 2020-01-31
      相关资源
      最近更新 更多