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命名空间之外的其他地方.
有没有人遇到过类似的问题,或者对其他可能相关的注册领域有所了解?
如果您不想在每个App.config文件中单独设置这些开关,则可以AppContext通过注册表在计算机范围内设置这些开关:
这些设置将影响所有未在App.config文件中指定不同值的.NET应用程序。也就是说,注册表设置仅更改默认值,仍然可以通过指定应用程序特定的值来覆盖默认值<AppContextSwitchOverrides value="..." />
启用LongPath.reg:
Run Code Online (Sandbox Code Playgroud)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
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |