验证Windows目录

时间:2011-12-12 18:11:51

标签: c# .net path directory

我正在寻找一种方法来检查Path是否是一个有效的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

如果您看到某些路径不起作用,请告诉我。 谢谢!

6 个答案:

答案 0 :(得分:3)

要检查字符串是否是目录路径的有效字符串, 您可以使用Path.GetDirectoryName来验证这一点。如果该方法引发异常或返回String.Empty,则它不是有效路径。

要查看字符串是否是文件系统中真实的现有目录,您可以使用Directory.Exists

答案 1 :(得分:1)

这是简单的正则表达式模式是最简单的解决方案之一:

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

答案 2 :(得分:0)

使用BCL Directory类,它有Exists()方法。

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

更新:我最初的假设是OP正在查看目录是否存在,因为他想知道语法是否有效,您可以使用Path.GetDirectoryName()(正如Reed首先指出的那样)返回路径的目录部分。

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

如果有任何无效字符,则会抛出如果要确保路径目录(而不是文件的路径),则可以比较返回目录的路径。

答案 3 :(得分:0)

return System.Directory.Exists(path);

编辑: 通过使用Path类,您可以测试路径字符串是否在语法上有效(如果没有,则Path.GetFileName和Path.GetDirectoryName引发异常)。但是,您无法确定它是代表文件还是目录。

enter image description here

图片显示的是一条看似代表文本文件的路径,但实际上是一个目录。另一方面,您可以使用类似“C:\ abc \ xyz”的路径,它看起来像一个目录路径,但也可以代表没有扩展名的文件。

例外是根目录“C:\”和其他路径字符串,以反斜杠结尾。但是,如果目录路径不以反斜杠结尾,那么它在语法上也是有效的。

结论:在大多数情况下,您必须针对实际存在的目录或文件测试路径字符串,以获得确定性。

答案 4 :(得分:0)

有效路径的规则记录在MSDN的文章Naming Files, Paths and Namespaces中。在您的情况下,什么构成“有效”取决于您想要的严格程度。从技术上讲,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等

在一天结束时,您不应检查路径是否有效。只是尝试打开或以其他方式操作用户提供的路径,如果您无法打开/操作他们给出的内容,则显示错误消息。这与用户交给你一个损坏的文件并要求你做出正面或反面的情况没什么不同。

答案 5 :(得分:-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;
}