Хотя 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 или в проводнике выглядит неправильно, так как символы Юникода не будут заменены обратно.)
Все это говорит о том, что вы делаете, что требует очень долгих путей? Возможно, вы могли бы облегчить свою жизнь, переоценив то, что делаете, и избегая долгих путей. Скорее всего, вам не нужны такие длинные пути .