Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证windows的目录_C#_.net_Path_Directory - Fatal编程技术网

C# 验证windows的目录

C# 验证windows的目录,c#,.net,path,directory,C#,.net,Path,Directory,我正在寻找一种方法来检查路径是否是有效的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 如果你看到某

我正在寻找一种方法来检查路径是否是有效的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
如果你看到某条路不起作用,请告诉我。
谢谢

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


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

使用BCL
目录
类,它有一个
Exists()
方法

if (Directory.Exists(@"c:\foo\baa.txt\baa"))
{
    // etc
}
更新:我最初的假设是OP在查看目录是否存在,因为他想知道语法是否有效,所以可以使用
Path.GetDirectoryName()
(如里德首先指出的)返回路径的目录部分

var dir = Path.GetDirectoryName(@"c:\foo\baa.txt\baa");
如果有任何无效字符,将抛出。如果要确保该路径只是一个目录(不是文件的路径),可以将该路径与返回的目录进行比较

return System.Directory.Exists(path);

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

return System.Directory.Exists(path);

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

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

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

很多方法

一:


有效路径的规则在本文的MSDN中有文档记录。在您的案例中,什么构成“有效”取决于您希望的严格程度。WindowsNT技术上支持几乎任何路径方面的内容,除了一些保留字符

也就是说,NT的Win32子系统不那么宽容,并且有一些您需要遵循的规则,例如保留文件名CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8和LPT9,等等


但在一天结束时,你不应该检查路径是否有效。只需尝试打开或以其他方式操作用户提供给您的路径,如果您无法打开/操作用户提供的路径,则显示错误消息。这与用户将一个损坏的文件交给您并要求您对其进行处理没有什么不同。

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

public static bool IsDirectory(string path)
{
    return Regex.IsMatch(path, 
        "([a-z]:)?\\\\[^/:*?\"<>|\\r\\n]*", 
        RegexOptions.IgnoreCase);
}
公共静态bool IsDirectory(字符串路径)
{
返回Regex.IsMatch(路径,
“([a-z]:)?\\\[^/:*?\”\\r\\n]*”,
RegexOptions.IgnoreCase);
}


即使目录不存在,路径也可能有效。@BillyONeal:Fair point,我从OP的问题中假设他想知道它是否是一个有效的现有目录,这是我的错误。第二个投票人可以发表意见吗?答案被更新以反映最初的担忧。@JamesMichaelHare这里没有线索-非常非常奇怪。我投了up你和比利的回答,因为我们三人解决了实际问题,但没有投任何反对票,因为它的措辞不够清楚,不能保证这一点,依我看,多次投反对票是非常奇怪的,因为我觉得我们直接解决了这个问题。@ReedCopsey:同意,我希望这不只是回答的姿态,你永远不会知道。我把o这些答案与帮助补偿相关。您想知道该字符串是有效的目录字符串,还是现有目录(即:文件系统上已经存在该目录?)@ReedCopsey:如果该字符串是有效的目录字符串。即使该目录不存在,该路径也可以有效。另外,如果该路径是一个文件呢?那也完全有效。如果该路径是一个文件,那么您将使用
file.Exists()
。此外,如果该字符串是有效的目录字符串,则他的注释“如果该字符串是一个有效的目录字符串,那么该路径将是有效的。”“是在我发布答案后发布的。最初的问题是“验证”,而不是“检查是否存在”。@BillyONeal:我刚刚做了测试。如果将现有文件的路径传递到
目录.Exists()
,则is将返回
false
!这与你回答的是存在而不是有效性有什么关系?路径的有效性与路径指向的位置无关。刚刚看到你的最新评论。这显然不会指示该字符串是否为有效的目录字符串,但仅在目录实际存在时才指示。您是否试图检查非法字符(如
°
)或无效路径(
Z:>
,当没有映射的Z驱动器时)?对否决票很好奇-GetDirectoryName将为您进行适当的验证…我注意到每个人都得到了它们。我还以为是你或比尔·奥尼尔对其他人的答案做的。@jp2code不是我-我没有否决任何答案,因为原来的问题不太清楚…我也很困惑,我还以为我更新了我的答案来纠正原来的顾虑…@jp2code:我否决了所有错误的答案——也就是说,它检查目录是否存在,而不是路径是否有效。我对这个答案投了赞成票,因为它是一个正确的答案。对其他人不确定。这似乎不允许,例如,
。\foo\bar
。这不是问题,但这一个->“([a-z]:\\\.{1,2})?\\\[^/:*?\”\\\\r\\n]*”