2012-07-18 231 views
0

我想从FTP服务器上的目录下载最旧的文件。从Linux FTP服务器和Windows 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. 你能否提出更明智的方式来获取最早的文件细节?

回答

0

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

从各方面来看,我知道存在大约400种格式的文件,其中Linux FTP可以响应ListDirectoryDetails

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

有几个解决方案,这一点:

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

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

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

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