2

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

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

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

4

1 回答 1

2

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

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

所以你不必使用FtpClient.GetFileSizeand FtpClient.GetModifiedTime per fileFtpClient.GetListing 按目录使用。MLSD如果服务器支持,它在内部使用. 否则它会回退LIST并尝试解析列表。


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

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

例如,对于我的 WinSCP .NET 程序集,您可以使用Session.EnumerateRemoteFiles

IEnumerable<RemoteFileInfo> allFiles =
    session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);
于 2018-05-21T06:25:23.887 回答