【问题标题】:Downloading oldest file from Linux FTP server and Windows FTP server从 Linux FTP 服务器和 Windows FTP 服务器下载最旧的文件
【发布时间】:2012-07-18 11:48:52
【问题描述】:

我想从 FTP 服务器上的目录中下载最旧的文件。

我正在使用FtpWebrequest 连接到FTP 服务器以获取目录中的文件列表。我使用WebRequestMethods.Ftp.ListDirectoryDetails 这样做。知道文件名后,我将创建另一个 FTP 连接来下载该文件。

但是,当 FTP 在 Linux 上和在 Windows 上时,我在 FtpWebResponse 流中获得的详细信息格式不同。

  1. 如何处理这个问题?
  2. 我可以为 Linux 和 Windows 编写不同的方法来解析响应流。但为此,至少 Linux Ftp 和 Windows FTP 提供细节的方式应该是明确的。您知道发送详细信息的方式是否会因一台 Linux FTP 服务器而异吗?
  3. 我观察到(至少在 Windows FTP 上)每次都会在响应流的末尾列出最旧的文件。文件名在每一行的末尾。我可以想当然地写代码吗?
  4. 您能否提出更智能的方法来获取最旧的文件详细信息?

【问题讨论】:

    标签: c# ftp ftp-client ftpwebrequest


    【解决方案1】:

    FTP 服务器发送响应的格式/模式取决于服务器的创建/编码方式。所以ListDirectoryDetails 的响应流的格式会因一台 Linux/Windows 服务器和另一台 Linux/Windows 服务器而异。

    从各种来源我了解到,Linux FTP 可以响应ListDirectoryDetails 的格式大约有 400 种。

    因此,您不能依赖或假设任何一种模式。

    有几个解决方案:

    1. 首先使用ListDirectory 命令。它会给你目录的内容(目录记录)。然后对于每个内容/目录记录,使用GetDateTimestamp。它会给你所有文件的日期时间戳,然后你可以决定哪个是最旧的文件。 但是这个解决方案效率不高,因为您必须为每个文件发出FtpWebRequest 才能知道日期时间戳。 (如果有 'n' 个文件,则调用 n+1 次。)

    2. 另一种解决方案是仅使用ListDirectoryDetails。这并不能以编程方式解决整个问题。

      您可以假设最常用的响应模式和代码。您可以在用户指南或配置指南等文档中记录此假设。它确实将您的解决方案限制为 Windows 和 Linux 的一种模式,但它应该是可以接受的。 (至少在我的情况下是可以接受的)。我认为针对最常遇到的模式进行编码是合理的,而不是编写试图处理所有可能模式的巨大而笨拙的代码(当你不确定是否还有一种模式时也是如此!)。

      您可以使用正则表达式来匹配响应模式,如果不匹配,您可以采取适当的措施,例如抛出一些异常等。另一个好处是您可以在 1 中获得“n”个文件的日期时间戳调用(将其与解决方案#1进行比较)。在 .NET 代码中确定最旧的日期时间戳肯定会更快,而不是调用 FTP 服务器 n+1 次。

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 2015-07-28
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      相关资源
      最近更新 更多