2011-11-10 353 views
3

我有一個包含一些FTP pathes,像如下的數組:C#FTP,如何檢查路徑是文件還是目錄?

「的ftp // IP /目錄/ directory1中」,
「FTP // IP /目錄/ directory2」,
「FTP // IP /directory/file.txt」,
「FTP // IP /目錄/ directory3目錄」,
「FTP // IP /目錄/ another_file.csv」

我如何才能知道路徑是文件或一個目錄?

在此先感謝。

+0

您是否有權限訪問服務器?如果是這樣,怎麼樣?這個問題缺乏很多細節。 – Dykam

+1

有沒有辦法告訴路徑。 – Oded

+0

如果你沒有訪問服務器,一個簡單的正則表達式檢查路徑是否有擴展名(即.xxx)是一種微弱但合理的方式去... – Didaxis

回答

2

沒有直接的辦法。

間接地,你可以假定沒有句點的文件名「。」是目錄,但這並不總是如此。

最好的辦法是仔細寫出消耗這些路徑的代碼,例如,將路徑視爲目錄,然後如果FTP服務器報告錯誤,請將其視爲文件。

3

一種方式做到這一點,如果我們可以假設,所有文件都將在一個擴展名結尾,所有目錄將不會有一個擴展,我們可以用這樣的System.IO.Path.GetExtension()方法:

public bool IsDirectory(string directory) 
{ 
    if(directory == null) 
    { 
     throw new ArgumentNullException(); // or however you want to handle null values 
    } 

    // GetExtension(string) returns string.Empty when no extension found 
    return System.IO.Path.GetExtension(directory) == string.Empty; 
} 
+0

這完全不可靠。目錄允許有「。」在他們中。 –

0

您可以使用System.IO.Path.GetExtension(path)',以此來檢查,如果您的路徑有一個文件擴展名。

鑑於 「FTP // IP /目錄/ directory1中」 或 「FTP // IP /目錄/ directory2 /」,GetExtension將返回的String.Empty給你。

這也不是萬無一失的,如果有一個文件沒有擴展名,這將徹底分解,或在它的週期的目錄可能會導致問題,這是可能的,但。

+0

感謝您的回答。我只是想讓你知道我在FTP服務器上有很多沒有擴展名的文件。 – Chamchamal

4

使用LIST命令,你可以參考RFC959,以獲取有關指定路徑下的項目的詳細信息。以FileZilla Server爲例,LIST命令將返回標準的LINUX權限格式,您可以在其中找到here。第一個字母表示請求的路徑是文件還是目錄。還用C#編寫一個簡單的庫可以發現here

0

我發現「黑客」如何確定目標類型。 如果你將一個文件夾上使用

request.Method = WebRequestMethods.Ftp.GetFileSize; 

,會造成異常

未處理的異常:System.Net.WebException:遠程服務器 返回埃羅R:(550)文件不可用(例如,文件沒有找到,沒有 訪問)。

但使用它的文件,它會自然恢復它的大小。

我已經爲這種方法創建了示例代碼。

static bool IsFile(string ftpPath) 
    { 
     var request = (FtpWebRequest)WebRequest.Create(ftpPath); 
     request.Method = WebRequestMethods.Ftp.GetFileSize; 

     request.Credentials = new NetworkCredential("foo", "bar"); 
     try 
     { 
      using (var response = (FtpWebResponse)request.GetResponse()) 
      using (var responseStream = response.GetResponseStream()) 
      { 
       return true; 
      } 
     } 
     catch(WebException ex) 
     { 
      return false; 
     } 
    } 

您可能想要改變它,因爲這一個會捕獲任何FTP錯誤。

0

這個問題很古老,但對於任何需要回答的人來說,最好的機會是使用正則表達式和ListDirectoryDe​​tails。

整個實現此處

http://blogs.msdn.com/b/adarshk/archive/2004/09/15/sample-code-for-parsing-ftpwebrequest-response-for-listdirectorydetails.aspx

+0

如果你給出的只是一個符號鏈接,那不會有幫助。 – user1932634

+0

是的,但我不認爲這是問題的一部分。 – netadictos

+0

的確,我不認爲它也是。更多的FYI。 – user1932634

2

我有同樣的問題。我從休斯的回答中解脫出來。你需要做的FTPRequest像:

request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

搶它的StreamReader,並把它貼在一個字符串

StreamReader reader = new StreamReader(responseStream); 

      string directoryRaw = null; 

      try { while (reader.Peek() != -1) { directoryRaw += reader.ReadLine() + "|"; } } 
      catch (Exception ex) { Console.WriteLine(ex.ToString()); } 

當您打印這個它會看起來像:

| -rw-r - r-- 1個用戶用戶1699 Jun 1 2015 404.shtml

| drwxr-xr-x 2用戶用戶4096 Sep 8 19:39 c GI-倉

| drwxr-XR-×2用戶的用戶4096 11月3日10時52 CSS

這些通過分隔|所以這將是分割字符串的分界線

如果它以d開頭而不是 - 然後它是一個目錄,否則它是一個文件。

這些在文件名之前的大小都是一樣的,所以爲從這個位置開始的每個字符串創建一個新的字符串以結束,這將是文件名。

希望它有幫助

相關問題