我正在运行一个非常简单的程序,它试图在同一台机器上的文件夹中列出文件,该文件使用UNC格式指定(如http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx中所述):
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(当 - path是零长度字符串,仅包含空格或包含由InvalidPathChars定义的一个或多个无效字符时抛出) 的)。 Console.Writeline()不会打印任何内容,这确认路径中没有无效的字符。我使用时会遇到同样的异常 “\\ UNC \?\ d:\ share \ input”或 “\\ UNC \?\ machinename \ share \ input”或 “\\?\计算机名\共享\输入”。
“d:\ share \ input”确实是一个共享文件夹。
有人知道可能出现什么问题吗?
谢谢!
答案 0 :(得分:8)
问题是\\?\
是.NET不支持的Windows API约定。如果您仔细阅读链接\\?\
并不表示UNC路径,但是Windows API的特殊约定:
对于文件I / O,"
\\?\
"路径字符串的前缀告诉Windows 用于禁用所有字符串解析并发送后续字符串的API 它直接进入文件系统。
.NET兼容的UNC格式为\\machinename\d$\share\input
。有关详细信息,请参阅this答案。
.NET不支持它的原因很可能是扩展路径约定并非在所有平台上都可用,因此不能保证框架能够使用它。