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

标签 .net ftp fluentftp

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

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

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

最佳答案

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 客户端。

例如my WinSCP .NET assembly ,您可以使用Session.EnumerateRemoteFiles :

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

关于.net - 在一次调用中递归获取所有 FTP 目录/文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50438785/

相关文章:

c# - 如何在 .NET 的单个单元测试中修改语言环境小数点分隔符?

c++ - 使用 QFtp,中止 list() 命令

c# - Fluent FTP 无法连接到 FTP 服务器

c# - 使用 FluentFTP 将文件从 FTP 复制到 blob 存储的 Azure 函数

jquery - 由于 jquery,Listview ItemCommand 没有触发

.net - Microsoft.NET\Framework 和 Microsoft.NET\Framework64 有什么区别?

java - Java 代码中的 commons-net FTPSClient 错误

powershell - 如何在FTP服务器中移动文件

c# - 使用 FluentFTP 连接到 FTPS(FTP over SSL)

c# - 最佳方法建议 : C# based Windows service implementation