请求解析System.IO.Directory.Exists()在Windows下的路径行为不一致问题
Windows路径验证与规范化机制测试

我正在研究Windows的路径验证/规范化机制,通过.NET的System.IO.Directory、System.IO.File和System.IO.Path类开展基础测试,测试环境为Windows 10系统上的PowerShell 7.4.2(基于.NET 8.0.4)。
根据微软官方博客说明:
通常传递给Windows API的路径会被传入GetFullPathName()进行规范化,但存在一个重要例外——以问号而非句点开头的设备路径。这类路径必须使用标准反斜杠,若路径并非以\?\开头则会被规范化。
但需要注意的是,除规范化步骤外,Windows并不支持正斜杠。
尽管如此,在处理非规范化UNC路径时,正斜杠在部分位置被视为有效路径分隔符,部分位置则不被认可(见截图)。
测试显示:.NET的System.IO类对\?\开头的路径未进行规范化,调用System.IO.Path.GetFullPath()不会转换正斜杠或合并重复分隔符。
此外,System.IO.Directory.Exists()、System.IO.File.Exists()和System.IO.Path.Exists()对非UNC路径中含/的非规范化路径一致拒绝,但对UNC路径的判断取决于分隔符的位置:据我观察,在共享名与顶级目录的分隔符及之前,正斜杠被视为无效,但在后续路径中可能有效。我之所以说“可能”,是因为主机名为LOCALHOST的UNC路径并不遵循此规律:

内容的提问来源于stack exchange,提问作者Mark Bereza
相关产品推荐
相关产品推荐

