我正在使用的应用程序需要处理文件名/路径名非常长的文件。这是一个.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 File Explorer中查看一个很长的文件时,“位置”字段使用r->“属性”菜单中的\\?\语法。
我猜测是有一些注册表项导致文件资源管理器中的差异和修复失败,但不是上面提到的FileSystem名称空间。
有人遇到过类似的问题,或者对其他可能相关的注册表区域有所了解吗?
答案 0 :(得分:0)
如果您不想在每个 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