0

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

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

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

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

1 回答 1

0

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

我从各种来源了解到大约有 400 种格式可供 Linux FTP 响应 ListDirectoryDetails.

所以你不能依赖或假设任何一种模式。

有几个解决方案:

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

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

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

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

于 2012-07-31T08:21:47.520 回答