Длинный путь \\? \ Обходной путь не работает на некоторых установках - PullRequest
0 голосов
/ 07 ноября 2018

Приложение, над которым я работаю, должно обрабатывать файлы с очень длинными именами файлов / путей. Это приложение .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.
    }
}

Это работает (ууу!) На всех машинах, на которых мы тестировали, , за исключением одной (бу!). Рассматриваемый компьютер, как и другие, является установкой Windows 10 Pro и имеет те же параметры реестра, что и пространство имен [Computer \ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ FileSystem].

Сообщение об ошибке на этом конкретном компьютере:

Указанный формат пути не поддерживается

Единственное отличие, которое мы видим на этом компьютере, заключается в том, что при просмотре очень длинного файла в проводнике Windows в поле «Местоположение» используется синтаксис \\? \ В меню r-click> Свойства.

Я предполагаю, что есть какой-то раздел реестра, который вызывает и эту разницу в File Explorer, и ошибку моего исправления, но где-то, кроме пространства имен FileSystem, упомянутого выше.

Кто-нибудь сталкивался с подобной проблемой или имеет представление о других областях реестра, которые могут иметь отношение к делу?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете установить эти AppContext параметры на уровне компьютера через реестр, если не хотите устанавливать их в каждом App.config файле по отдельности:

enter image description here

Эти настройки влияют на все .NET приложения, которые не указывают другое значение в своем файле App.config . То есть параметр реестра изменяет только значение по умолчанию , которое все еще можно переопределить значениями, специфичными для приложения, указав <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
...