代码之家  ›  专栏  ›  技术社区  ›  oscilatingcretin

在一次调用中递归获取所有ftp目录/文件列表

  •  1
  • oscilatingcretin  · 技术社区  · 7 年前

    我正在创建一个备份程序,将数据备份到ftp。为了有效地存档,我需要进行几个文件属性比较。现在,我正在使用 FluentFTP 和呼叫 FtpClient.FileExists FtpClient.GetFileSize FtpClient.GetModifiedTime 每个文件 . 这显然不是很理想。

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

    除了推出我自己的解决方案,还有别的办法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Martin Prikryl    7 年前

    ftp提供以下命令来检索有关远程文件的信息:

    • NLST 在特定目录中检索文件名 全部的 服务器)。
    • SIZE MDTM 检索特定文件的大小和修改文件 实际上 所有服务器。
    • LIST 检索目录列表,包括支持的文件属性 全部的 服务器,但是列表没有标准化,因此不能真正实现机器可读。尽管大多数服务器都支持*nix样式的列表(如*nix ls 命令)。尽管每个人都有自己的怪癖。
    • 数字多用表 要检索目录列表,包括机器可读格式的文件属性-此命令最不受支持。它尤其不受*nix vsftpd和Windows IIS的支持。

    所以你不必使用 FtpClient.GetFileSize FtpClient.GetModifiedTime 每个文件 . 使用 FtpClient.GetListing 按目录 . 内部使用 MLSD ,如果服务器支持。否则它会回到 尝试分析列表。


    一些FTP服务器(如proftpd)确实支持非标准专有的 -R 切换到 命令,使它们返回所有子文件夹中的列表。Fluenttp也支持这一点( FtpListOption.Recursive )但是请注意,Fluenttp使用 -R 具有 只有,虽然它更喜欢使用 多层螺旋CT ,如果服务器支持。所以要确保 LIST -R 使用时,您需要同时使用 ftplistopation.recursive FtpListOption.ForceList .

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

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

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