C# UNC路径不适用于.NET?

C# UNC路径不适用于.NET?,c#,.net,windows,disk-io,C#,.net,Windows,Disk Io,我正在运行一个非常简单的程序,该程序试图列出同一台计算机上文件夹中的文件,该文件夹使用UNC格式指定(如中所述): 静态字符串rootDir=@“\\?\d:\share\input” 静态void Main(字符串[]参数) { char[]invlidChars=Path.GetInvalidPathChars(); foreach(invlidChars中的char invChar) { if(rootDir.Contains(invChar.ToString())) { WriteLi

我正在运行一个非常简单的程序,该程序试图列出同一台计算机上文件夹中的文件,该文件夹使用UNC格式指定(如中所述):


静态字符串rootDir=@“\\?\d:\share\input”

静态void Main(字符串[]参数) { char[]invlidChars=Path.GetInvalidPathChars(); foreach(invlidChars中的char invChar) { if(rootDir.Contains(invChar.ToString())) { WriteLine(“InvChar-{0}”,InvChar); } } string[]matchFiles=Directory.GetFiles(rootDir); }

但是,Directory.GetFiles()不起作用并引发ArgumentException(当-path为零长度字符串、仅包含空格或包含InvalidPathChars定义的一个或多个无效字符时引发)。Console.Writeline()不打印任何内容,这将确认路径中没有无效字符。当我使用 “\\UNC\?\d:\share\input”或 “\\UNC\?\machinename\share\input”或 “\\?\machinename\share\input”

“d:\share\input”实际上是一个共享文件夹

有人知道会出什么问题吗


谢谢

问题在于,
\\?\
是一种windows API约定,不受.NET支持。如果仔细阅读链接
\\?\
,则该链接并不表示UNC路径,而是windows API的特殊约定:

对于文件I/O,路径字符串的“
\\?\
”前缀告诉Windows API来禁用所有字符串解析并发送后面的字符串 它直接进入文件系统

与.NET兼容的UNC格式应为
\\machinename\d$\share\input
。有关更多信息,请参阅答案


.NET不支持它的原因很可能是扩展路径约定在所有平台上都不可用,因此无法保证框架能够正常工作。

我推荐这篇关于长路径、MAXPATH限制、\\?\prefix和其他.NET问题的古老但仍然相关的概述:感谢链接Avner S-K;这澄清了具有长路径的.NET和Windows API的行为。UNC:将UNC路径的“\\”替换为“\\?\UNC\”。正如您所指出的,确实\\?\不是UNC的一部分,而是特定于Windows的。这就回答了问题!是的,有更多的细节。我添加了一个关于UNC路径和测试的部分。

static string rootDir = @"\\?\d:\share\input";

static void Main(string[] args) { char[] invlidChars = Path.GetInvalidPathChars(); foreach (char invChar in invlidChars) { if (rootDir.Contains(invChar.ToString())) { Console.WriteLine("InvChar - {0}", invChar); } } string[] matchFiles = Directory.GetFiles(rootDir); }