Подтвердить что ты не робот

Как избежать System.IO.PathTooLongException?

Мы постоянно сталкиваемся с этой проблемой...

Пример:

Если у меня есть файл, который я хочу скопировать в другой каталог или общий ресурс UNC, и если длина пути превышает 248 (если я не ошибаюсь), тогда он выдает исключение PathTooLongException. Есть ли способ обхода проблемы?

PS: Есть ли какой-либо параметр реестра, чтобы установить этот путь для более длинного char?

4b9b3361

Ответ 1

Как описано в Jeremy Kuhne blog,.NET Framework 4.6.2 удаляет MAX_PATH, где это возможно, без нарушения обратной совместимости.

Ответ 2

Попробуйте следующее: Библиотека 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

Ответ 3

Это подробно обсуждается командой BCL, смотрите записи

В сущности, нет никакого способа сделать это в .Net-коде и придерживаться BCL. Слишком много функций полагаются на возможность канонизировать имя пути (которое сразу же запускает использование функций, ожидающих выполнения MAX_PATH).

Вы можете обернуть все функции win32, поддерживающие синтаксис "\\? \", с помощью которых вы сможете реализовать набор функций с длинным пути, но это будет громоздким.

Поскольку огромное количество инструментов (в том числе explorer [1]) не может обрабатывать длинные имена путей, не рекомендуется идти по этому маршруту, если вы не счастливы, что все взаимодействие с результирующей файловой системой проходит через вашу библиотеку (или ограниченное число инструментов, которые построены для его обработки как robocopy)

В ответ на ваши конкретные потребности я бы исследовал, будет ли использование robocopy напрямую достаточным для выполнения этой задачи.

[1] Vista имеет способы смягчить проблему с каким-то причудливым переименованием под капотом, но это в лучшем случае хрупкое)

Ответ 5

Проблема заключается в версиях ANSI для Windows API. Одним из решений, которое необходимо тщательно протестировать, является принудительное использование Unicode-версий Windows API. Это можно сделать, добавив "\\?\" к запрашиваемому пути.

Большую информацию, в том числе о работе, можно найти в следующих сообщениях в блоге из библиотеки базовых классов Microsoft (BCL) под названием "Длинные пути в .NET":

Ответ 7

В С# для меня это обходное решение:

/*make long path short by setting it to like cd*/
string path = @"\\godDamnLong\Path\";
Directory.SetCurrentDirectory(path);

Ответ 8

Эта библиотека может быть полезна: Zeta Long Paths