в то время как NTFS позволяет пути длиной около 32000 символов, вы нашли 259-ограничение длины пути символов Win32 API.
в Windows API (за некоторыми исключениями, описанными в [связанном документе]) максимальная длина пути MAX_PATH
, что определяется как 260 символов.
(дополнительно к NULL
символ завершения, добавленный к пути, дает нам 259 полезных письмена.)
потому что Explorer (и почти все другие приложения Windows) полагаются на Win32 API для доступа к файловой системе, это не практические чтобы обойти это ограничение, даже если это возможно:
API Windows имеет много функций, которые также имеют версии 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 позволяет создавать файлы со специальными символами, но делает это с помощью замена символов со специальными символами Юникода, затем подставляет обратно при чтении. Просмотр этих Cygwin-созданных файлов под Linux или в Проводнике не будет выглядеть правильным, так как символы Юникода не будут заменены обратно.)
все это говорит о том, что вы делаете, что требует очень длинных путей? Возможно, вы могли бы сделать свою жизнь проще, переоценивая то, что вы делаете, и избегая длинных путей. Скорее всего, вы не нужны пути, которые так долго в любом случае.