Ответ 1
Как описано в Jeremy Kuhne blog,.NET Framework 4.6.2 удаляет MAX_PATH
, где это возможно, без нарушения обратной совместимости.
Мы постоянно сталкиваемся с этой проблемой...
Пример:
Если у меня есть файл, который я хочу скопировать в другой каталог или общий ресурс UNC, и если длина пути превышает 248 (если я не ошибаюсь), тогда он выдает исключение PathTooLongException. Есть ли способ обхода проблемы?
PS: Есть ли какой-либо параметр реестра, чтобы установить этот путь для более длинного char?
Как описано в Jeremy Kuhne blog,.NET Framework 4.6.2 удаляет MAX_PATH
, где это возможно, без нарушения обратной совместимости.
Попробуйте следующее: Библиотека Delimon.Win32.I O (V4.0). Этот Libarary написан на .NET Framework 4.0
Delimon.Win32.IO заменяет основные файловые функции System.IO и поддерживает имена файлов и папок вплоть до 32,767.
https://gallery.technet.microsoft.com/DelimonWin32IO-Library-V40-7ff6b16c
Эта библиотека написана специально для преодоления ограничения .NET Framework для использования длинных имен Path и File. С помощью этой библиотеки вы можете программно просматривать, получать доступ, писать, удалять и т.д. Файлы и папки, недоступные в пространстве имен System.IO.Library
Использование
Сначала добавьте ссылку на файл Delimon.Win32.IO.dll в свой проект (Перейдите в файл Delimon.Win32.IO.dll)
В вашем файле кода добавьте "using Delimon.Win32.IO"
Используйте обычные объекты File и Directory, как если бы вы работали с System.IO
Это подробно обсуждается командой BCL, смотрите записи
В сущности, нет никакого способа сделать это в .Net-коде и придерживаться BCL. Слишком много функций полагаются на возможность канонизировать имя пути (которое сразу же запускает использование функций, ожидающих выполнения MAX_PATH).
Вы можете обернуть все функции win32, поддерживающие синтаксис "\\? \", с помощью которых вы сможете реализовать набор функций с длинным пути, но это будет громоздким.
Поскольку огромное количество инструментов (в том числе explorer [1]) не может обрабатывать длинные имена путей, не рекомендуется идти по этому маршруту, если вы не счастливы, что все взаимодействие с результирующей файловой системой проходит через вашу библиотеку (или ограниченное число инструментов, которые построены для его обработки как robocopy)
В ответ на ваши конкретные потребности я бы исследовал, будет ли использование robocopy напрямую достаточным для выполнения этой задачи.
[1] Vista имеет способы смягчить проблему с каким-то причудливым переименованием под капотом, но это в лучшем случае хрупкое)
Только одно обходное решение, которое я видел на этом... это может быть полезно
Проблема заключается в версиях ANSI для Windows API. Одним из решений, которое необходимо тщательно протестировать, является принудительное использование Unicode-версий Windows API. Это можно сделать, добавив "\\?\
" к запрашиваемому пути.
Большую информацию, в том числе о работе, можно найти в следующих сообщениях в блоге из библиотеки базовых классов Microsoft (BCL) под названием "Длинные пути в .NET":
Я использовал команду "subst", чтобы обойти проблему... http://www.techrepublic.com/article/mapping-drive-letters-to-local-folders-in-windows-xp/5975262
В С# для меня это обходное решение:
/*make long path short by setting it to like cd*/
string path = @"\\godDamnLong\Path\";
Directory.SetCurrentDirectory(path);
Эта библиотека может быть полезна: Zeta Long Paths