长路径\\?\ workaround无法处理某些安装

tec*_*ebe 6 c# windows registry file file-handling

我正在处理的应用程序需要处理具有很长文件/路径名的文件.这是一个.Net 4.6应用程序,所以我实现了4.6.2之前的解决方法,以允许此处此处概述的\\?\语法.

这是我用来启用该功能的代码(我无法修改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.
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我们测试过的所有机器都有效(yay!),除了一个(嘘!).有问题的计算机是Windows 10 Pro安装,与其他计算机一样,并且在[Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]命名空间中具有相同的注册表设置.

此特定计算机上的错误消息是:

不支持给定的路径格式

我们在该计算机上看到的一个区别是,在Windows文件资源管理器中查看非常长的文件时,"位置"字段在r-click>"属性"菜单中使用\\?\语法.

我猜测有一些注册表项导致文件浏览器中的这种差异,以及我的修复失败,但除了上面提到的FileSystem命名空间之外的其他地方.

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

Gle*_*den 3

如果您不想在每个App.config文件中单独设置这些开关,则可以AppContext通过注册表在计算机范围内设置这些开关:

在此输入图像描述

这些设置将影响所有未在App.config文件中指定不同值的.NET应用程序。也就是说,注册表设置仅更改默认值,仍然可以通过指定应用程序特定的值来覆盖默认值<AppContextSwitchOverrides value="..." />


启用LongPath.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext]
"Switch.System.IO.BlockLongPaths"="false"
"Switch.System.IO.UseLegacyPathHandling"="false"
Run Code Online (Sandbox Code Playgroud)


C:\>regedit.exe EnableLongPath.reg


归档时间:

查看次数:

126 次

最近记录:

7 年,3 月 前