UNC 路径不适用于 .NET?
Posted
技术标签:
【中文标题】UNC 路径不适用于 .NET?【英文标题】:UNC path does not work with .NET? 【发布时间】:2012-06-16 01:32:54 【问题描述】:我正在运行一个非常简单的程序,它试图在同一台机器上的一个文件夹中列出文件,该文件使用 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”确实是一个共享文件夹。
有人知道哪里出了问题吗?
谢谢!
【问题讨论】:
我推荐这个旧的但仍然相关的长路径概述、MAXPATH 限制、\\?\ 前缀和其他 .NET 问题:blogs.msdn.com/b/bclteam/archive/2007/02/13/… 感谢 Avner S-K 的链接;这阐明了具有长路径的 .NET 和 Windows-API 的行为。 UNC:对于 UNC 路径,将“\\”替换为“\\?\UNC\” 【参考方案1】:问题在于\\?\
是.NET 不支持的Windows API 约定。如果您在链接中仔细阅读\\?\
不表示UNC 路径,而是Windows API 的特殊约定:
对于文件 I/O,路径字符串的“
\\?\
”前缀告诉 Windows 用于禁用所有字符串解析并发送后面的字符串的 API 它直接到文件系统。
.NET 兼容的 UNC 格式为 \\machinename\d$\share\input
。有关更多信息,请参阅this 答案。
.NET 不支持它的原因很可能是扩展路径约定并非在所有平台上都可用,因此无法保证框架可以正常工作。
【讨论】:
感谢 Mike Z 的回复。正如您所指出的,\\?\ 确实不是 UNC 的一部分,而是特定于 Windows 的。这回答了问题! 是的,***.com/questions/6867463/… 有更多详细信息。我添加了一个关于 UNC 路径和测试的部分。以上是关于UNC 路径不适用于 .NET?的主要内容,如果未能解决你的问题,请参考以下文章
将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径