2011-12-12 83 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