Почему в Windows существует ограничение длины пути 260 символов?



Answers

Это не совсем верно, так как файловая система NTFS поддерживает пути до 32 тыс. Символов. Вы можете использовать win32 api и " \\?\ " Префикс пути для использования более 260 символов.

Подробное объяснение длинного пути из блога команды .Net BCL .
Небольшая выдержка подчеркивает проблему с длинными дорожками

Еще одна проблема заключается в непоследовательном поведении, которое может быть вызвано оказанием поддержки длинного пути. Длинные пути с префиксом \\?\ Могут использоваться в большинстве связанных с файлами API Windows, но не во всех Windows API. Например, LoadLibrary, которая отображает модуль в адрес вызывающего процесса, терпит неудачу, если имя файла больше MAX_PATH. Таким образом, это означает, что MoveFile позволит вам переместить DLL в такое местоположение, чтобы его путь был длиннее 260 символов, но при попытке загрузить DLL он потерпит неудачу. В Windows API есть аналогичные примеры; существуют некоторые обходные пути, но они основаны на каждом конкретном случае.

Question

Я несколько раз сталкивался с этой проблемой в неподходящие моменты:

  • пытаясь работать с Java-проектами с открытым исходным кодом с глубокими путями
  • Хранение глубоких вики-деревьев Fitnesse в управлении версиями
  • Ошибка при попытке использовать Bazaar для импорта моего дерева управления исходным кодом

Почему этот предел существует?

Почему он еще не удален?

Как вы справляетесь с лимитом пути? ... и нет, переход на Linux или Mac OS X не является верным ответом на этот вопрос;)




Что касается того, как справиться с ограничением по размеру пути в Windows - с помощью 7zip для упаковки (и распаковки) ваши файлы с длиной пути считаются жизнеспособным обходным решением. Я использовал его для переноса нескольких установок IDE (эти плагины Eclipse, yikes!) И груды автогенерированной документации и до сих пор не было ни одной проблемы.

Не совсем уверен, как он уклоняется от ограничения 260 символов, установленного Windows (от технического PoV), но эй, это работает!

Более подробную информацию можно найти на странице SourceForge here :

«NTFS может фактически поддерживать имена путей длиной до 32 000 символов».

7-zip также поддерживает такие длинные имена.

Но он отключен в коде SFX. Некоторым пользователям не нравятся длинные пути, поскольку они не понимают, как работать с ними. Вот почему я отключил его в SFX-коде.

и примечания к выпуску :

9.32 alpha 2013-12-01

  • Улучшена поддержка имен файлов длиной более 260 символов.

4.44 beta 2007-01-20

  • 7-Zip теперь поддерживает имена файлов длиной более 260 символов.

ВАЖНОЕ ЗАМЕЧАНИЕ. Для правильной работы вам необходимо указать путь назначения в диалоговом окне «Извлечь» 7zip напрямую, а не перетаскивать файлы в нужную папку. В противном случае папка «Temp» будет использоваться в качестве промежуточного кеша, и вы будете отказываться от одного и того же ограничения 260 символов, как только проводник Windows начнет перемещать файлы в «конечное место отдыха». См. Ответы на этот вопрос для получения дополнительной информации.




В то время как все кричат, что 260 символов ужасны в 2017 году, почему-то никто не кричит, что большинство gnu shitware ломается, если сталкивается с пробелами в дорожках. Даже не unicode. И говоря о неотъемлемо сломанных функциях - подумайте о своей любимой strcpy без n . Даже malloc разбивается на linux, потому что он полагается на ошибки страницы, чтобы фактически зарезервировать зарезервированное адресное пространство (которое медленное и подверженное ошибкам). Никто не совершенен, и невежество не является веской причиной для ныть.

Кроме того, комментаторы почему-то не говорят, что именно сломано.

Есть три вещи, которые сломаны:

  • некоторые вызовы (я знаю только о Get / SetCurrentDirectoryW) ограничены одним потоком и 260 символами независимо от того, что. Таким образом, по-существу относительные пути разбиваются на Windows, эмулируют их так же, как вы эмулируете fork если вы вынуждены.

  • программное обеспечение, перенесенное из не-окон, которые по своей основе полагаются на концепции, отличные от окон (включая концепцию текущих путей / относительных путей, см. выше)

  • программное обеспечение, написанное с нуля для Windows, но по-прежнему использует древний API (но см. выше), в то время как есть API для общего доступа к файловой системе, нет API для текущего каталога в Windows, который работает после MAX_PATH)

Что касается того, почему он все еще сломан - по-моему, MS исправила все, что можно исправить. Я думаю, что это наследование текущего каталога дочерними процессами, который не позволяет фиксировать GetCurrentDirectoryW.




Из Windows 10. вы можете удалить ограничение , изменив раздел реестра.

Совет Начиная с Windows 10, версии 1607, ограничения MAX_PATH были удалены из общих функций файла и каталога Win32. Однако вы должны отказаться от нового поведения.

Раздел реестра позволяет включить или отключить поведение нового длинного пути. Чтобы включить длительное поведение пути, установите ключ реестра в HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Тип: REG_DWORD ). Значение ключа будет кэшироваться системой (за процесс) после первого вызова поврежденного файла или каталога Win32 (список следует). Ключ реестра не будет перезагружен в течение всего жизненного цикла процесса. Чтобы все приложения в системе могли распознавать значение ключа, может потребоваться перезагрузка, поскольку некоторые процессы могли быть запущены до того, как был установлен ключ. Ключ реестра можно также контролировать с помощью групповой политики в Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths . Вы также можете включить новое поведение длинного пути для каждого приложения через манифест:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
        <ws2:longPathAware>true</ws2:longPathAware>
    </windowsSettings>
</application>



Один из способов справиться с лимитом пути - сократить пути записей с символическими ссылками.

Например:

  1. создайте каталог C:\p чтобы сохранить короткие ссылки на длинные пути
  2. mklink /JC:\p\foo C:\Some\Crazy\Long\Path\foo
  3. добавьте C:\p\foo в свой путь вместо длинного пути



Links