2012-06-13 60 views
5

我运行一个非常简单的程序,这是试图列出在同一台机器,这是使用UNC格式(如http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx描述)指定的文件夹中的文件:UNC路径不适用于.NET?


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); }

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

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

有人知道什么可能是错的吗?

谢谢!

+0

我推荐这个旧的但仍然相关的长路径概述,MAXPATH限制,\\?\前缀和其他.NET问题:http://blogs.msdn.com/b/bclteam/archive/2007/02/ 13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx –

+0

感谢链接Avner SK;这阐明了长路径的.NET和Windows-API的行为。 – whywhywhy

回答

8

问题是\\?\是.NET不支持的Windows API约定。如果您在您的链接仔细阅读\\?\不表示UNC路径,但对于Windows API的特别约定:

对于文件I/O,在“\\?\”前缀的路径字符串告诉Windows的 的API禁用所有字符串解析并将它跟在 之后的字符串直接发送到文件系统。

NET兼容的UNC格式将是\\machinename\d$\share\input。有关更多信息,请参阅this回答。

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

+0

感谢Mike Z的回应。正如你指出的那样\\?\不是UNC的一部分,而是Windows的特定部分。这回答了这个问题! – whywhywhy