Я сталкивался с этой проблемой несколько раз в неподходящие моменты:
- Попытка работать над проектами Java с открытым исходным кодом с глубокими путями
- Хранение глубоких вики-деревьев Fitnesse в системе контроля версий
- Ошибка при попытке использовать Bazaar для импорта моего дерева управления исходным кодом
Почему существует этот предел?
Почему это еще не было удалено?
Как вы справляетесь с ограничением пути? И нет, переход на Linux или Mac OS X не является правильным ответом на этот вопрос;)
Ответы:
Цитирование этой статьи https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Теперь мы видим, что это 1 + 2 + 256 + 1 или [диск] [: \] [путь] [ноль] = 260. Можно предположить, что 256 - это разумная фиксированная длина строки из дней DOS. Возвращаясь к API DOS, мы понимаем, что система отслеживает текущий путь на диск, и у нас есть 26 (32 с символами) максимум дисков (и текущих каталогов).
INT 0x21 AH = 0x47 говорит: «Эта функция возвращает описание пути без буквы диска и начальной обратной косой черты». Итак, мы видим, что система хранит CWD в виде пары (диск, путь), и вы запрашиваете путь, указывая диск (1 = A, 2 = B,…), если вы задаете 0, то она принимает путь для привод возвращается INT 0x21 AH = 0x15 AL = 0x19. Итак, теперь мы знаем, почему это 260, а не 256, потому что эти 4 байта не хранятся в строке пути.
Почему строка пути 256 байт, потому что 640 КБ достаточно ОЗУ.
источник
Это не совсем так, поскольку файловая система NTFS поддерживает пути до 32 тыс. Символов. Вы можете использовать API-интерфейс win32 и
\\?\
префикс " ", чтобы использовать путь длиной более 260 символов.Подробное объяснение длинного пути из блога команды .Net BCL .
Небольшая выдержка подчеркивает проблему с длинными путями
источник
Вопрос в том, почему ограничение все еще существует. Конечно, современные Windows могут увеличить сторону,
MAX_PATH
чтобы позволить более длинные пути. Почему ограничение не было снято?Благодаря контракту API, Windows гарантировала всем приложениям, что стандартные файловые API никогда не будут возвращать путь длиннее
260
символов.Рассмотрим следующий правильный код:
Windows гарантировала моей программе, что она заполнит мою
WIN32_FIND_DATA
структуру:Мое приложение не объявляло значение константы
MAX_PATH
, а Windows API. Мое приложение использовало это определенное значение.Моя структура правильно определена, и только выделяет
592
всего байтов. Это означает, что я могу получить только имя файла, которое меньше260
символов. Windows пообещала мне, что если я напишу свое приложение правильно, оно продолжит работать в будущем.Если бы Windows разрешала имена файлов длиннее
260
символов, то мое существующее приложение (которое правильно использовало правильный API) не получилось бы.Любой, кто призывает Microsoft изменить
MAX_PATH
константу, сначала должен убедиться, что ни одно из существующих приложений не выходит из строя. Например, я все еще владею и использую приложение Windows, которое было написано для работы в Windows 3.11. Он по-прежнему работает на 64-битной Windows 10. Это то, что дает вам обратная совместимость.Microsoft сделал создать способ использовать полные имена путей 32768; но они должны были создать новый контракт API для этого. Во-первых, вы должны использовать Shell API для перечисления файлов (поскольку не все файлы существуют на жестком диске или в сетевой папке).
Но они также должны не нарушать существующие пользовательские приложения. Подавляющее большинство приложений не используют API оболочки для работы с файлами. Каждый просто звонит
FindFirstFile
/FindNextFile
и называет это днем.источник
В Windows 10. вы можете снять ограничение , изменив раздел реестра.
источник
Вы можете смонтировать папку как диск. Из командной строки, если у вас есть путь,
C:\path\to\long\folder
вы можете сопоставить его с буквой диска,X:
используя:источник
subst
это local-session / account - см. superuser.com/questions/29072/… чтобы узнать, как сделать его «общесистемным»Один из способов справиться с ограничением пути - сократить записи пути с помощью символических ссылок.
Например:
C:\p
каталог для хранения коротких ссылок на длинные путиmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
к вашему пути вместо длинного путиисточник
/j
Опция создает спая для монтирования локального устройства тома или путь на локальном томе (как Unix BIND монтирования). Это не создает символическую ссылку. Это важное различие, так как точки монтирования соединения всегда оцениваются на сервере и должны предназначаться для локальных устройств, тогда как символические ссылки оцениваются на клиенте и могут предназначаться для удаленных путей (если это разрешено политикой). Как и у диска subst.exe (т. Е.DefineDosDeviceW
), Длина точки соединения обычно не превышает 4 КБ. На самом деле это 8K символов, равномерно распределенных между замещающим путем и путем отображения.Вы можете включить длинные имена путей, используя PowerShell:
Другая версия заключается в использовании групповой политики в
Computer Configuration
/Administrative Templates
/System
/Filesystem
:источник
Что касается того, почему это все еще существует - MS не считает это приоритетом и ценит обратную совместимость по сравнению с продвижением своих ОС (по крайней мере, в этом случае).
Обходной путь, который я использую, состоит в том, чтобы использовать «короткие имена» для каталогов в пути, вместо их стандартных, удобочитаемых версий. Так, например, для
C:\Program Files\
я бы использовалC:\PROGRA~1\
Вы можете найти эквиваленты короткого имени, используяdir /x
.источник
PATH
и передать егоSearchPathW
. Это также эффективно, поскольку библиотека времени выполнения в любом случае создает "\\? \" Пути к устройствам для NT. Что касается более новых файловых систем, мы, вероятно, не увидим программное обеспечение, установленное на томе exFAT, кроме переносимых приложений, поскольку оно не имеет защиты, но я бы не стал исключать ReFS. Пользователи устанавливают программы в нестандартных местах по соображениям удобства, места или производительности.Что касается того, как справиться с ограничением размера пути в Windows - использование 7zip для упаковки (и распаковки) файлов, чувствительных к длине пути, кажется приемлемым обходным путем. Я использовал его для переноса нескольких инсталляций IDE (эти пути к подключаемым модулям Eclipse, yikes!) И груды автоматически сгенерированной документации, и до сих пор не было ни одной проблемы.
Не совсем уверен, как он преодолевает ограничение в 260 символов, установленное Windows (из технической точки зрения), но эй, это работает!
Более подробная информация на их странице SourceForge здесь :
и примечания к выпуску :
ВАЖНОЕ ПРИМЕЧАНИЕ. Чтобы это работало правильно, вам нужно указать путь к месту назначения в диалоговом окне «Извлечь» из 7zip , а не перетаскивать файлы в нужную папку. В противном случае папка «Temp» будет использоваться в качестве промежуточного кэша, и вы попадете в то же ограничение в 260 символов, как только Windows Explorer начнет перемещать файлы в их «окончательное место покоя». Смотрите ответы на этот вопрос для получения дополнительной информации.
источник
Это так, и по какой-то причине это значение по умолчанию, но вы можете легко переопределить его следующим ключом реестра:
См .: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/.
источник
Другой способ справиться с этим - использовать Cygwin, в зависимости от того, что вы хотите делать с файлами (например, если команды Cygwin удовлетворяют вашим потребностям)
Например, он позволяет копировать, перемещать или переименовывать файлы, что даже Windows Explorer не может. Или, конечно, иметь дело с содержимым таких как md5sum, grep, gzip и т. Д.
Также для программ, которые вы кодируете, вы можете связать их с Cygwin DLL, и это позволит им использовать длинные пути (хотя я не проверял это, хотя)
источник