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?的主要内容,如果未能解决你的问题,请参考以下文章

UNC 路径上的 VC++ Createprocess

长路径 \\?\ 解决方法不适用于某些安装

将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径

d3剪辑路径不适用于填充折线图

如何在 Java 中检查文件大小而不从 UNC 路径读取文件?

在 C# 中将 UNC 路径转换为本地路径