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

时间:2018-11-07 16:04:54

标签: c# windows file registry file-handling

我正在使用的应用程序需要处理文件名/路径名非常长的文件。这是一个.Net 4.6应用程序,因此我已经实现了4.6.2之前的变通办法,以允许\\?\语法概述为herehere

这是我用来启用该功能的代码(我无法修改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 File Explorer中查看一个很长的文件时,“位置”字段使用r->“属性”菜单中的\\?\语法。

我猜测是有一些注册表项导致文件资源管理器中的差异和修复失败,但不是上面提到的FileSystem名称空间。

有人遇到过类似的问题,或者对其他可能相关的注册表区域有所了解吗?

1 个答案:

答案 0 :(得分:0)

如果您不想在每个 App.config 文件中分别设置它们,可以通过注册表在机器范围内设置这些AppContext开关:

enter image description here

这些设置将影响所有在其 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