长路径 \\?\ 解决方法不适用于某些安装
Posted
技术标签:
【中文标题】长路径 \\\\?\\ 解决方法不适用于某些安装【英文标题】:Long path \\?\ workaround not working on some installs长路径 \\?\ 解决方法不适用于某些安装 【发布时间】:2019-04-11 02:35:36 【问题描述】:我正在开发的应用程序需要处理文件/路径名很长的文件。这是一个 .Net 4.6 应用程序,因此我实现了 4.6.2 之前的解决方法,以允许使用 \\?\ 语法,如 here 和 here 所述。
这是我用来启用该功能的代码(我无法修改 app.config,因此必须在代码中设置):
var type = Type.GetType("System.AppContext");
if (type != null)
AppContext.SetSwitch("Switch.System.IO.UseLegacyPathHandling", false);
AppContext.SetSwitch("Switch.System.IO.BlockLongPaths", false);
var switchType = Type.GetType("System.AppContextSwitches");
if (switchType != null)
// We also have to reach into System.AppContextSwitches and manually update the cached private versions of these properties (don't ask me why):
var legacyField = switchType.GetField("_useLegacyPathHandling", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
legacyField?.SetValue(null, (Int32)(-1)); // <- caching uses 0 to indicate no value, -1 for false, 1 for true.
var blockingField = switchType.GetField("_blockLongPaths", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
blockingField?.SetValue(null, (Int32)(-1)); // <- caching uses 0 to indicate no value, -1 for false, 1 for true.
这在我们测试过的所有机器上都有效(耶!),除了一个(嘘!)。有问题的机器与其他机器一样是 Windows 10 Pro 安装,并且在 [Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] 命名空间中具有相同的注册表设置。
这台机器上的错误信息是:
不支持给定的路径格式
我们可以在该机器上看到的一个区别是,在 Windows 文件资源管理器中查看一个很长的文件时,“位置”字段使用 r-click > 属性菜单中的 \\?\ 语法。
我猜有一些注册表项会导致文件资源管理器中的差异和我的修复失败,但不是上面提到的 FileSystem 命名空间。
有没有人遇到过类似的问题,或者知道其他可能相关的注册表区域?
【问题讨论】:
任何错误信息? @RuiJarimba 好问题!它是“不支持给定的路径格式”。我已经更新了我的问题。 那台机器上安装的 .NET 版本是什么?和其他机器上的一模一样吗? 黑暗中的一枪 - 检查this post 我会对此进行一些探索,非常感谢。 【参考方案1】:如果您不想在每个 App.config 文件中单独设置这些 AppContext
开关,则可以通过注册表在机器范围内设置它们:
这些设置将影响所有未在其 App.config 文件中指定不同值的 .NET 应用。也就是说,注册表设置只更改了默认值,仍然可以通过指定<AppContextSwitchOverrides value="..." />
EnableLongPath.reg:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext] "Switch.System.IO.BlockLongPaths"="false" "Switch.System.IO.UseLegacyPathHandling"="false"
C:\>regedit.exe EnableLongPath.reg
【讨论】:
以上是关于长路径 \\?\ 解决方法不适用于某些安装的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 python pandas 数据框剥离方法不适用于尾随空格?我该如何解决?
如何解决 CrudRepository<FinancialTransaction,String> 类型中的方法 save(S) 不适用于参数(付款)