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

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

Пример:

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

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

Как описано в блоге Джереми Куне, .NET Framework 4.6.2 по возможности устраняет ограничение MAX_PATH , не нарушая совместимость с MAX_PATH .

Попробуйте это: Delimon.Win32.I O Library (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

Применение

  1. Сначала добавьте ссылку на файл Delimon.Win32.IO.dll в свой проект (перейдите в файл Delimon.Win32.IO.dll)

  2. В вашем файле кода добавьте «using Delimon.Win32.IO»

  3. Используйте обычные объекты File и Directory, как если бы вы работали с System.IO

Это подробно обсуждается командой BCL, см. Записи в блоге

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

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

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

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

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

Только 1 обходной путь, который я видел на этом … это может быть полезно

http://www.codeproject.com/KB/files/LongFileNames.aspx

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

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

Я использовал команду «subst» для решения этой проблемы … http://www.techrepublic.com/article/mapping-drive-letters-to-local-folders-in-windows-xp/5975262

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

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

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

Решение My Drive-Mapping работает нормально и стабильно, используя «NetWorkDrive.cs» и «NetWorkUNCPath.cs», которые можно загрузить с https://www.mycsharp.de/wbb2/thread.php?postid=3807703#post3807703

Пример испытания:

 if (srcFileName.Length > 260) { string directoryName = srcFileName.Substring(0, srcFileName.LastIndexOf('\\')); var uncName = GetUNCPath(srcFileName.Substring(0, 2)) + directoryName.Substring(2); using (NetWorkDrive nDrive = new NetWorkDrive(uncName)) { drvFileName = nDrive.FullDriveLetter + Path.GetFileName(sourceFileName) File.Copy(drvFileName, destinationFileName, true); } } else { File.Copy(srcFileName, destinationFileName, true); } 
  • Как приложение Metro в Windows 8 взаимодействует с настольным настольным окном на одном компьютере?
  • self.variable и переменная разница
  • Являются ли ссылки этих объектов на стек или на кучу?
  • Каков самый быстрый способ чтения текстового файла по очереди?
  • MySqlCommand Command.Parameters.Add устарел
  • Какой уровень качества использует Image.Save () для jpeg-файлов?
  • Как элементы массива C ++ обрабатываются в функциях управления копированием?
  • Как разбирать очень большие XML-файлы в C #?
  • Отправка столбцов матрицы с использованием MPI_Scatter
  • Если строки .NET неизменны в .NET, то почему Подстановка принимает O (n) время?
  • Почему «SwitchTo» был удален из Async CTP / Release?
  • Давайте будем гением компьютера.