我有一個包含一些FTP pathes,像如下的數組:C#FTP,如何檢查路徑是文件還是目錄?
「的ftp // IP /目錄/ directory1中」,
「FTP // IP /目錄/ directory2」,
「FTP // IP /directory/file.txt」,
「FTP // IP /目錄/ directory3目錄」,
「FTP // IP /目錄/ another_file.csv」
我如何才能知道路徑是文件或一個目錄?
在此先感謝。
我有一個包含一些FTP pathes,像如下的數組:C#FTP,如何檢查路徑是文件還是目錄?
「的ftp // IP /目錄/ directory1中」,
「FTP // IP /目錄/ directory2」,
「FTP // IP /directory/file.txt」,
「FTP // IP /目錄/ directory3目錄」,
「FTP // IP /目錄/ another_file.csv」
我如何才能知道路徑是文件或一個目錄?
在此先感謝。
沒有直接的辦法。
間接地,你可以假定沒有句點的文件名「。」是目錄,但這並不總是如此。
最好的辦法是仔細寫出消耗這些路徑的代碼,例如,將路徑視爲目錄,然後如果FTP服務器報告錯誤,請將其視爲文件。
一種方式做到這一點,如果我們可以假設,所有文件都將在一個擴展名結尾,所有目錄將不會有一個擴展,我們可以用這樣的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;
}
這完全不可靠。目錄允許有「。」在他們中。 –
您可以使用System.IO.Path.GetExtension(path)',以此來檢查,如果您的路徑有一個文件擴展名。
鑑於 「FTP // IP /目錄/ directory1中」 或 「FTP // IP /目錄/ directory2 /」,GetExtension將返回的String.Empty給你。
這也不是萬無一失的,如果有一個文件沒有擴展名,這將徹底分解,或在它的週期的目錄可能會導致問題,這是可能的,但。
感謝您的回答。我只是想讓你知道我在FTP服務器上有很多沒有擴展名的文件。 – Chamchamal
我發現「黑客」如何確定目標類型。 如果你將一個文件夾上使用
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錯誤。
這個問題很古老,但對於任何需要回答的人來說,最好的機會是使用正則表達式和ListDirectoryDetails。
整個實現此處
如果你給出的只是一個符號鏈接,那不會有幫助。 – user1932634
是的,但我不認爲這是問題的一部分。 – netadictos
的確,我不認爲它也是。更多的FYI。 – user1932634
我有同樣的問題。我從休斯的回答中解脫出來。你需要做的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開頭而不是 - 然後它是一個目錄,否則它是一個文件。
這些在文件名之前的大小都是一樣的,所以爲從這個位置開始的每個字符串創建一個新的字符串以結束,這將是文件名。
希望它有幫助
您是否有權限訪問服務器?如果是這樣,怎麼樣?這個問題缺乏很多細節。 – Dykam
有沒有辦法告訴路徑。 – Oded
如果你沒有訪問服務器,一個簡單的正則表達式檢查路徑是否有擴展名(即.xxx)是一種微弱但合理的方式去... – Didaxis