FTP 提供这些命令来检索有关远程文件的信息:
NLST检索特定目录中的文件名 -所有服务器都支持。
SIZE并MDTM检索特定文件的大小和修改文件 -几乎所有服务器都支持。
LIST检索目录列表,包括文件属性——所有服务器都支持,但列表不是标准化的,因此不是真正的机器可读。尽管大多数服务器将支持 *nix 样式列表(如 *nixls命令)。虽然每个人都会有它的怪癖。
MLSD检索目录列表,包括机器可读格式的文件属性 - 最不支持此命令。*nix vsftpd 和 Windows IIS 尤其不支持它。
所以你不必使用FtpClient.GetFileSizeand FtpClient.GetModifiedTime per file。FtpClient.GetListing 按目录使用。MLSD如果服务器支持,它在内部使用. 否则它会回退LIST并尝试解析列表。
一些 FTP 服务器(如 ProFTPD)确实支持对命令进行非标准专有-R切换,LIST这将使它们返回所有子文件夹的列表。FluentFTP 也支持 ( FtpListOption.Recursive)。尽管请注意 FluentFTP 仅使用-Rwith LIST,而MLSD如果服务器支持它,它更喜欢使用 。因此,为了确保LIST -R使用,您需要同时使用FtpListOption.Recursive和FtpListOption.ForceList。
如果你的服务器不支持-R开关,你必须自己实现递归。或者使用具有 API 的 FTP 客户端。
例如,对于我的 WinSCP .NET 程序集,您可以使用Session.EnumerateRemoteFiles:
IEnumerable<RemoteFileInfo> allFiles =
session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);