我正在创建一个备份程序,将数据备份到FTP。要有效存档,我需要进行多个文件属性比较。现在,我正在使用HEAD~4^2
并致电FluentFTP
FtpClient.FileExists
,以及每个文件{/ 1}} 。这显然不是很理想。
如果我可以在一次调用中下载FTP目录的整个树结构以及文件属性,它将大大提高备份速度。另一种方法是建立一个本地索引,但是我必须确保它正确地更新并且还要考虑它被破坏的可能性。
除了推出自己的解决方案之外,还有什么方法可以做到这一点吗?
答案 0 :(得分:1)
FTP提供这些命令来检索有关远程文件的信息:
NLST
检索特定目录中的文件名称 - 由所有服务器支持)。SIZE
和MDTM
检索某个文件的大小和修改文件 - 由虚拟所有服务器支持。LIST
检索目录列表,包括文件属性 - 由所有服务器支持,但列表不是标准化的,因此不是真正的机器可读。虽然大多数服务器都支持* nix样式列表(如* nix ls
命令)。虽然每个人都有它的怪癖。MDTM
检索目录列表,包括机器可读格式的文件属性 - 最不支持此命令。 * 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客户端。
例如,使用我的 WinSCP .NET assembly,您可以使用Session.EnumerateRemoteFiles
:
IEnumerable<RemoteFileInfo> allFiles =
session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);