在一次调用中递归获取所有FTP目录/文件列表

时间:2018-05-20 19:46:32

标签: .net ftp

我正在创建一个备份程序,将数据备份到FTP。要有效存档,我需要进行多个文件属性比较。现在,我正在使用HEAD~4^2并致电FluentFTP FtpClient.FileExists,以及每个文件{/ 1}} 。这显然不是很理想。

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

除了推出自己的解决方案之外,还有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

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

  • NLST检索特定目录中的文件名称 - 由所有服务器支持)。
  • SIZEMDTM检索某个文件的大小和修改文件 - 由虚拟所有服务器支持。
  • LIST检索目录列表,包括文件属性 - 由所有服务器支持,但列表不是标准化的,因此不是真正的机器可读。虽然大多数服务器都支持* nix样式列表(如* nix ls命令)。虽然每个人都有它的怪癖。
  • MDTM检索目录列表,包括机器可读格式的文件属性 - 最不支持此命令。 * 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客户端。

例如,使用我的 WinSCP .NET assembly,您可以使用Session.EnumerateRemoteFiles

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