Перейти к основному контенту
Центр разработки для Windows

 none
Поддержка длинных путей в Net.Framework 4.7.2 RRS feed

  • Общие обсуждения

  • Для решения проблемы с ограничением путей до 255 символов было сделано следующее:

    1. Windows 10 2004 в "Local Computer Policy" включен "Enable Win32 long paths".
    2. В ветке реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem.
    установлен LongPathsEnabled = 1

    3. Создан проект в VS (Net.Framework 4.7.2)
    4. Добавлен файл манифеста (app.manifest) включающий longPathAware
    5. В App.Config дописан <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />

    Но исключение PathToLong возникает по прежнему при работе с System.IO

Все ответы

  • Здравствуйте,

    А только с System IO наблюдается? Раз в реестре прописано и в манифесте все, единственное условие которое должно выдавать исключение, это если больше 32,767 символов, в чем я сомневаюсь. Возможно что-то не так настроено.


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    Модератор
  • А только с System IO наблюдается?

    Да, в частности с FileCreate и Directory.CreateDirectory. Путь для теста имеет длину 300 символов.
  • Покажите полную распечатку исключения вызвав ToString() на исключении.

    Так же, вы используйте префикс "\\?\" для задания пути?


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор
  • С префиксом "\\?\" исключение

    "System.IO.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома." & vbCrLf & vbCrLf & "   в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)" & vbCrLf & "   в System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)" & vbCrLf & "   в System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)" & vbCrLf & "   в System.IO.Directory.CreateDirectory(String path)" & vbCrLf & "   в TestLongPath.Form1.Button1_Click(Object sender, EventArgs e) в C:\Users\Monstrum\source\repos\TestLongPath\TestLongPath\Form1.vb:строка 22"

    Без префикса

    "System.IO.PathTooLongException: Слишком длинный путь или имя файла. Полное имя файла должно содержать меньше 260 знаков, а имя каталога - меньше 248 знаков." & vbCrLf & "   в System.IO.LongPathHelper.Normalize(String path, UInt32 maxPathLength, Boolean checkInvalidCharacters, Boolean expandShortPaths)" & vbCrLf & "   в System.IO.Path.NewNormalizePath(String path, Int32 maxPathLength, Boolean expandShortPaths)" & vbCrLf & "   в System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)" & vbCrLf & "   в System.IO.Path.GetFullPathInternal(String path)" & vbCrLf & "   в System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)" & vbCrLf & "   в System.IO.Directory.CreateDirectory(String path)" & vbCrLf & "   в TestLongPath.Form1.Button1_Click(Object sender, EventArgs e) в C:\Users\Monstrum\source\repos\TestLongPath\TestLongPath\Form1.vb:строка 22"

  • С префиксом "\\?\" исключение

    "System.IO.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома." & vbCrLf & vbCrLf & "   в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)" & vbCrLf & "   в System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)" & vbCrLf & "   в System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)" & vbCrLf & "   в System.IO.Directory.CreateDirectory(String path)" & vbCrLf & "   в TestLongPath.Form1.Button1_Click(Object sender, EventArgs e) в C:\Users\Monstrum\source\repos\TestLongPath\TestLongPath\Form1.vb:строка 22"

    Без префикса

    "System.IO.PathTooLongException: Слишком длинный путь или имя файла. Полное имя файла должно содержать меньше 260 знаков, а имя каталога - меньше 248 знаков." & vbCrLf & "   в System.IO.LongPathHelper.Normalize(String path, UInt32 maxPathLength, Boolean checkInvalidCharacters, Boolean expandShortPaths)" & vbCrLf & "   в System.IO.Path.NewNormalizePath(String path, Int32 maxPathLength, Boolean expandShortPaths)" & vbCrLf & "   в System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)" & vbCrLf & "   в System.IO.Path.GetFullPathInternal(String path)" & vbCrLf & "   в System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)" & vbCrLf & "   в System.IO.Directory.CreateDirectory(String path)" & vbCrLf & "   в TestLongPath.Form1.Button1_Click(Object sender, EventArgs e) в C:\Users\Monstrum\source\repos\TestLongPath\TestLongPath\Form1.vb:строка 22"

    Вы не забыли символы в префиксе заискейпить? Проверьте работу для начала с коротким путем и префиксом.

    Полезно так же ознакомиться с исходниками:

    https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,e57c4f51a45a6133

    Обратите внимание на вызов PathInternal.IsExtended(path))


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор
  • 1. В документации по адресу https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN приводится пример адреса. Цитата: To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\very long path".

    Поскольку я работаю в VB.Net, то я использую конкатенацию строк, и как я понимаю эскейп символ не нужен.

    2. С коротким путем отлично работает включая путь с префиксом.

    3. PathInternal.IsExtended(path)) это понятно

    4. Кроме того пишут, что префикс не нужен в моем случае. Цитата:

    При использовании префикса “\\?\” мы можем работать с длинными путями как в Win API,
    Directory.CreateDirectory("\\\\?\\" + long_dir_name);
    Если активировать нативную поддержку длинных имен файлов Windows 10 (1607), то даже не потребуется использовать префикс!

    5. Утверждают, что если приложение скомпилировано под .Net Framework 4.6.2 и позже, то изменение конфигурационного файла не требуется, Цитата:

    Использовать .Net Framework 4.6.2 как цель при сборке приложения.
    Использовать конфигурационный файл, например, если приложение уже было собрано под .Net 4.0:

    6 Я пробовала также сторонние библиотеки для исправления ошибки длинных путей:

    Long Path from the BCL CodePlex library.
    Delimon.Win32.IO Library from the Microsoft TechNet Gallery.
    AlphaFS
    Zeta Long Paths

    Как и следовало ожидать эта ошибка встречена мною и при использовании этих библиотек.

  • В этом случае похоже проблема не на уровне .Net.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор