Хотя NTFS допускает пути длиной около 32 000 символов, вы обнаружили ограничение длины пути в 259 символов в Win32 API.
В Windows API (за некоторыми исключениями, которые обсуждались в [связанном документе]), максимальная длина пути равна MAX_PATH
, которая определяется как 260 символов.
(Дополнительно к пути добавлен символ завершения NULL
, что дает нам 259 используемых символов.)
Поскольку Explorer (и почти все другие приложения Windows) полагаются на Win32 API для доступа к файловой системе, обойти это ограничение не практично, даже если это возможно:
Windows API имеет много функций, которые также имеют версии Unicode, чтобы разрешить путь расширенной длины для максимальной общей длины пути 32 767 символов. Этот тип пути состоит из компонентов , разделенных обратной косой черты, каждый до значения , возвращаемого в параметре lpMaximumComponentLength
функции GetVolumeInformation
(это значение обычно 255 символов). Чтобы указать путь расширенной длины, используйте "\\?\" префикс. Например, "\\?\D:\очень длинный путь ".
К сожалению, вы не можете просто набрать \\?\D:\very long path
к окну проводника. Приложение должно быть разработано так, чтобы использовать преимущества этих API и обрабатывать очень длинные пути.
Один из способов доступа к путям расширенной длины в Windows - установить Cygwin, слой эмуляции * nix для Windows. В моем тестировании Cygwin не ограничивался MAX_PATH
; У bash и vi не было проблем с путями длиной 2000 символов.
Имейте в виду, что даже если вы можете использовать bash для просмотра путей расширенной длины, вы, вероятно, не сможете открывать файлы по этим путям в обычных приложениях Windows. Например, если вы наберете « notepad
а рабочий каталог - это путь расширенной длины, вы получите
Ошибка: текущий рабочий каталог имеет более длинный путь, чем разрешено для рабочего каталога Win32. Не могу запустить собственное приложение Windows отсюда.
И пытается notepad "\\?\D:\very long path\file.txt"
тоже не работает; он запускается, а просто говорит "Не удается найти файл...". Попытка повторить то же самое с Notepad++ приводит к сбою. (Вероятно, переполнение буфера.)
Другой доступ к определенным файлам, зарытым глубоко внутри пути расширенной длины, - сократить сам путь путем создания точки соединения NTFS. Из командной строки с повышенными правами:
D:\> mklink /J jct "\\?\D:\very\long\path"
Теперь вы можете получить доступ к содержимому D:\very\long\path\
из D:\jct\
. Вы не столкнетесь с проблемами длины пути, потому что для Explorer и других приложений путь - просто D:\jct\
(или любой другой). Драйвер NTFS обеспечивает прозрачное перенаправление пути ("точка повторной обработки").
Недостатком этого подхода является то, что вы должны создать соединение рядом с файлом, к которому хотите получить доступ; Вы все еще не можете просто просмотреть всю структуру каталогов.
Что касается специальных символов (" * : < > ? \ |
), это просто не ходи. Эти символы имеют особое значение в Windows, поэтому их невозможно использовать в путях. (Cygwin позволяет создавать файлы со специальными символами, но делает это путем замены символов специальными символами Unicode, которые затем заменяются при чтении. Просмотр этих созданных Cygwin файлов в Linux или в Explorer не будет выглядеть правильно, так как символы Unicode не будут заменены обратно.)
Все это говорит, что ты делаешь, что требует очень долгих путей? Возможно, вы могли бы облегчить свою жизнь, переоценив то, что делаете, и избегая долгих путей. Скорее всего, вам не нужны такие длинные пути.