2011-12-12 91 views
3

我正在尋找一種方法來檢查Path是否是有效的Windows目錄。驗證windows目錄

目前,我是這個代碼:

public static bool IsDirectory(string path) { 
     return Path.IsPathRooted(path) && String.IsNullOrEmpty(Path.GetFileName(path)); 
} 

我需要把它提高到工程以下路徑:

C:\foo\baa.txt\baa 
\baa\x\ 
\baa\x 
\baa 

,如果你看到不工作的一些路徑,請告訴我。 謝謝!

+0

你想知道,如果字符串是一個有效的目錄字符串,或者如果它是一個現有的目錄(即:它是已經存在於文件系統上?) –

+0

@ReedCopsey:如果字符串是有效的目錄字符串。 –

回答

3

要檢查字符串是否爲目錄路徑的有效字符串,您可以使用Path.GetDirectoryName來驗證該字符串。如果該方法引發異常或返回String.Empty,那麼它不是有效的路徑。

要查看字符串是否是文件系統中真實的現有目錄,可以使用Directory.Exists

+0

好奇的downvotes - GetDirectoryName會做適當的驗證你... –

+0

我注意到每個人都得到了它們。我以爲是你或者Bill ONeal這樣做才能讓所有人都知道答案。 – jp2code

+0

@ jp2code不是我 - 我沒有downvote任何答案,因爲原來的問題是不是非常清楚... –

0

使用BCL Directory類,它有一個Exists()方法。

if (Directory.Exists(@"c:\foo\baa.txt\baa")) 
{ 
    // etc 
} 

UPDATE:我原來的設想是,OP是想看看是否該目錄存在,因爲他想知道只是如果語法是有效的,你可以使用Path.GetDirectoryName()(裏德首先指出)返回路徑的目錄部分。

var dir = Path.GetDirectoryName(@"c:\foo\baa.txt\baa"); 

如果任何無效字符會拋出。如果你想確保路徑只有一個目錄(不是文件的路徑),你可以比較路徑和返回的目錄。

+2

即使目錄不存在,路徑也可以是有效的。 –

+0

@BillyONeal:公平點,我從OP的問題中想到他想知道它是否是一個有效的現有目錄,我的錯誤。 –

+0

第二位選民可以發表評論嗎?答案已更新,以反映最初的擔憂。 –

0
return System.Directory.Exists(path); 

編輯: 通過使用Path類,你可以測試一個路徑字符串在語法上是有效的(Path.GetFileName如果沒有Path.GetDirectoryName引發異常)。但是,您無法確定它是否代表文件或目錄。

enter image description here

圖爲看起來就像站在一個文本文件,但實際上是一個目錄的路徑。另一方面,你可以有一個類似「C:\ abc \ xyz」的路徑,它看起來像一個目錄路徑,但也可以代表沒有擴展名的文件。

異常是根目錄「C:\」和其他路徑字符串,以反斜槓結尾。但是,如果不以反斜槓結尾,目錄路徑在語法上也是有效的。

結論:在大多數情況下,您必須針對實際存在的目錄或文件測試您的路徑字符串以獲得確定性。

+1

即使目錄不存在,路徑也可以有效。另外,如果路徑是一個文件呢?那也是完全有效的。 –

+0

如果路徑是一個文件,那麼你會使用'File.Exists()'。另外,他的評論「如果該字符串是一個有效的目錄字符串」張貼後我張貼我的答案。 –

+0

原來的問題是「驗證」,而不是「檢查存在」。 –

-1

很多方法。

一:

public static bool IsDirectory(string path) { 
    if (!String.IsNullOrEmpty(path)) { 
    if (Path.DirectoryExists(path)) { 
     DirectoryInfo dir = new DirectoryInfo(path); 
     return ((dir.Attributes & FileAttributes.Directory) == FileAttributes.Directory); 
    } 
    } 
    return false; 
} 
+0

這檢查是否存在,而不是該字符串是一個有效的目錄名稱... –

+0

剛剛看到您的最新評論。這顯然不能表明該字符串是否是有效的目錄字符串,但僅當該目錄實際存在時才表示該字符串。 – jp2code

+0

您是否嘗試檢查非法字符(如'°')或無效路徑(當沒有映射Z驅動器時''Z:>'')? – jp2code

0

一個有效的路徑規則是文章Naming Files, Paths and Namespaces中記錄在MSDN上。什麼構成你的「有效」取決於你想成爲多麼嚴格。 Windows NT技術上支持幾乎所有的路徑,除了一些保留字符外。

也就是說,NT的Win32子系統有點寬容,並且有一些規則需要遵守,比如保留的文件名CON,PRN,AUX,NUL,COM1,COM2,COM3,COM4 ,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9等。

儘管你不應該檢查路徑是有效的。只要嘗試打開或以其他方式在用戶提供的路徑上進行操作,並且如果您無法打開/操作他們提供的內容,則會顯示錯誤消息。這實際上與用戶給你一個損壞的文件並要求你做出正面或反面的情況沒有什麼不同。

+0

+1,因爲你是對的,而其他人沒有 – Kakashi

1

這是其中一個簡單的正則表達式模式是最簡單的解決方案的情況之一:

public static bool IsDirectory(string path) 
{ 
    return Regex.IsMatch(path, 
     "([a-z]:)?\\\\[^/:*?\"<>|\\r\\n]*", 
     RegexOptions.IgnoreCase); 
} 
+0

這似乎不允許例如'.. \富\ bar'。 –

+0

這不是問題,而是這個 - >「([az]:| \\。{1,2})?\\\\ [^ /:*?\」<> | \\ r \\ N] *」 – 2011-12-13 07:30:37