我正在创建一个备份程序,将数据备份到 FTP。为了有效归档,我需要进行多次文件属性比较。现在,我正在使用 FluentFTP
并调用 FtpClient.FileExists
FtpClient.GetFileSize
和 FtpClient.GetModifiedTime
每个文件。这显然不是很理想。
如果我可以在一次调用中下载 FTP 目录的整个树结构以及文件属性,则将大大提高备份速度。另一种方法是构建本地索引,但随后我必须确保它正确更新,并考虑到它被损坏的可能性。
除了推出我自己的解决方案之外,还有其他方法可以做到这一点吗?
最佳答案
FTP 提供以下命令来检索有关远程文件的信息:
NLST
用于检索特定目录中的文件名称 - 所有服务器均支持。SIZE
和MDTM
用于检索特定文件的大小和修改文件 - 几乎所有服务器都支持。LIST
用于检索目录列表,包括文件属性 - 所有服务器均支持,但该列表未标准化,因此并非真正的机器可读。尽管大多数服务器都支持 *nix 样式列表(如 *nixls
命令)。尽管每个都有其怪癖。MLSD
用于检索目录列表,包括机器可读格式的文件属性 - 此命令最少受支持。 *nix vsftpd 和 Windows IIS 特别不支持它。
因此,您不必为每个文件使用 FtpClient.GetFileSize
和 FtpClient.GetModifiedTime
。每个目录使用FtpClient.GetListing
。如果服务器支持,它在内部使用 MLSD
。否则,它将返回到 LIST
并尝试解析列表。
某些 FTP 服务器(如 ProFTPD)确实支持将非标准专有 -R
切换到 LIST
命令,这将使它们返回所有子文件夹的列表。 FluentFTP 也支持这一点(FtpListOption.Recursive
)。但请注意,FluentFTP 仅将 -R
与 LIST
一起使用,而如果服务器支持的话,它更喜欢使用 MLSD
。因此,为了确保使用 LIST -R
,您需要同时使用 FtpListOption.Recursive
和 FtpListOption.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/