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

    2020년 5월 25일 월요일 오후 10:13

모든 응답

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

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


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

    2020년 5월 26일 화요일 오후 3:57
    중재자
  • А только с System IO наблюдается?

    Да, в частности с FileCreate и Directory.CreateDirectory. Путь для теста имеет длину 300 символов.
    2020년 5월 26일 화요일 오후 5:37
  • Покажите полную распечатку исключения вызвав ToString() на исключении.

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


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

    2020년 5월 26일 화요일 오후 6:23
    중재자
  • С префиксом "\\?\" исключение

    "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"

    2020년 5월 27일 수요일 오후 11:27
  • С префиксом "\\?\" исключение

    "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.

    2020년 5월 28일 목요일 오전 12:17
    중재자
  • 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

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

    2020년 5월 28일 목요일 오후 7:22
  • В этом случае похоже проблема не на уровне .Net.

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

    2020년 5월 28일 목요일 오후 9:51
    중재자