2012-07-18 264 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次。