在处理长路径时,添加 "\\?\" 前缀不起作用。

4
我正在尝试寻找一种解决Windows字符限制的方法,该限制不允许复制文件名长度>= 260个字符的文件。根据这篇MSDN文章,如果在文件名前加上\\?\,则可以规避文件名长度限制。
我尝试了以下测试:
string source = "\\\\?\\C:\\Users\\xxxx\\Documents\\Visual Studio 2013\\Projects\\PDFConverterTester\\PDFConverterTester_BatchGUI\\bin\\Debug\\folder1\\a.txt";
string dest= "\\\\?\\C:\\Users\\xxxx\\Documents\\Visual Studio 2013\\Projects\\PDFConverterTester\\PDFConverterTester_BatchGUI\\bin\\Debug\\folder2\\a.txt";            
System.IO.File.Copy(source, dest);

但是这会抛出一个异常:

Illegal characters in path.

我应该以不同的方式应用这个前缀吗?

编辑:我的公司IT政策不允许我在没有经过漫长的审查过程的情况下安装任何新软件,这意味着我无法更新到4.6.2版本。因此,我正试图通过从我现有的.NET 4.5安装的Visual Studio中调用Windows API来解决这个问题。


你是否正在运行 .NET Framework 4.6.2? - yaakov
1个回答

6
为了启用长路径支持,您需要目标为 .Net Framework 4.6.2(或更高版本),或者告知您的应用程序可以支持长文件名。要做到这一点,请将以下内容添加到您的 app.config 文件中:
<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>

更多阅读可以在这里进行。


1
根据Jeremy Kuhne的博客所述,您只需要其中之一而不是两者都需要。如果您的目标是.NET Framework 4.6.2,则这些开关已经设置为false。只有在旧版本的.NET Framework中目标设为true时,您才需要将其明确设置为false。这也是参考来源所示的:请参阅if (version <= 40601)块。 - user743382
@hvd 很有趣,我刚刚在运行这个并决定是否更新这个答案。 - DavidG
2
请注意,您在答案中链接的博客文章是关于透明处理长文件路径,即不需要应用程序添加\\?\前缀。这可能更好,但需要操作系统支持(具有非标准设置的最新Windows 10)。我提供的链接则涵盖了不拒绝\\?\路径,需要应用程序解决长路径问题,但可以在更多系统上运行。 - user743382
我的公司IT政策不允许我在经过漫长的审核程序之前安装任何新软件,这意味着我无法升级到4.6.2。因此,我正在尝试通过Windows API调用解决这个问题,从我的现有.NET 4.5安装的Visual Studio中进行操作。我将使用这些信息更新我的问题。 - sigil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接