【问题标题】:Prepending "\\?\" doesn't work for handling long paths前置 "\\?\" 不适用于处理长路径
【发布时间】:2017-05-11 07:03:24
【问题描述】:

我正在尝试寻找解决 Windows 字符限制的解决方法,如果文件名称 >= 260 个字符,则不允许复制文件。根据this MSDN article,如果在文件名前加上\\?\,这将绕过文件名长度限制。

我试过这个测试:

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。所以我想弄清楚如何通过我现有的 Visual Studio .NET 4.5 安装中的 Windows API 调用来解决这个问题。

【问题讨论】:

  • 您是否在 .NET Framework 4.6.2 上运行?

标签: c# .net path filepath


【解决方案1】:

要启用长路径支持,您需要以 .Net Framework 4.6.2(或更高版本)为目标,或者您需要告诉您的应用它可以支持长文件名。为此,请将其添加到您的 app.config:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>

可以进一步阅读here

【讨论】:

  • 根据上面的Jeremy Kuhne's blog,你需要其中一个,而不是两个。如果您以 .NET Framework 4.6.2 为目标,则这些开关已设置为 false。如果它们被隐式设置为 true,则只需将它们显式设置为 false,因为您的目标是较旧的 .NET Framework 版本。这也是reference source 的含义:参见if (version &lt;= 40601) 块。
  • @hvd 有趣的是,我现在刚刚经历了一遍,并决定是否更新这个答案。
  • 请注意,您在答案中链接到的博客文章是关于透明地处理长文件路径,即无需应用程序必须预先添加 \\?\。这可能更好,但需要操作系统支持(具有非标准设置的最新 Windows 10)。我链接到的内容包括不拒绝 \\?\ 路径,需要针对长路径的应用程序变通方法,但使其适用于更多系统。
  • 我公司的 IT 政策不允许我在没有经过漫长审查过程的情况下安装任何新软件,这意味着我无法更新到 4.6.2。所以我试图弄清楚如何通过我现有的 Visual Studio .NET 4.5 安装中的 Windows API 调用来解决这个问题。我会用这些信息更新我的问题。
猜你喜欢
  • 2013-11-15
  • 2019-10-14
  • 2012-08-29
  • 1970-01-01
  • 2011-07-12
  • 2019-10-13
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多