Обычный рецепт - вызвать его, установив размер на ноль, и он гарантированно потерпит неудачу и предоставит размер, необходимый для выделения достаточного буфера. Выделите буфер (не забудьте место для нулевого завершения) и вызовите его во второй раз.
Во многих случаях достаточно MAX_PATH
, поскольку многие файловые системы ограничивают общую длину имени пути. Тем не менее, можно создать допустимые и полезные имена файлов, которые превышают MAX_PATH
, поэтому, вероятно, это хороший совет для запроса требуемого буфера.
Не забудьте в конце концов вернуть буфер из распределителя, который его предоставил.
Редактировать: Фрэнсис в комментарии отмечает, что обычный рецепт не работает для GetModuleFileName()
. К сожалению, Фрэнсис абсолютно прав в этом вопросе, и мое единственное оправдание заключается в том, что я не пошел, чтобы проверить его, прежде чем предлагать «обычное» решение.
Я не знаю, о чем думал автор этого API, за исключением того, что вполне возможно, что когда он был представлен, MAX_PATH
действительно был максимально возможным путем, что облегчало правильный рецепт. Просто выполните все манипуляции с именами файлов в буфере длиной не менее MAX_PATH
символов.
О, да, не забывайте, что имена путей с 1995 года или около того допускают символы Юникода. Поскольку Unicode занимает больше места, любому имени пути может предшествовать \\?\
, чтобы явно запросить, чтобы ограничение MAX_PATH
на его длину в байтах было снято для этого имени. Это усложняет вопрос.
MSDN имеет это, чтобы сказать о длине пути в статье под названием Имена файлов, пути и пространства имен :
Максимальная длина пути
В Windows API (с некоторыми
исключения обсуждаются в следующем
абзацы), максимальная длина для
путь MAX_PATH
, который определяется как
260 символов. Локальный путь
структурирован в следующем порядке:
буква диска, двоеточие, обратный слеш,
компоненты, разделенные обратной косой чертой,
и завершающий нулевой символ. За
Например, максимальный путь на диске D
это "D:\<some 256 character path
string><NUL>
", где "<NUL>
" представляет
невидимый завершающий ноль
символ для текущей системы
кодовая. (Используются символы <
>
здесь для наглядности и не может быть
часть допустимой строки пути.)
Примечание. Функции ввода-вывода файла в
Windows API преобразует "/
" в "\
" как часть
преобразования имени в стиль NT
имя, кроме случаев использования "\\?\
"
префикс, как описано в следующем
разделы.
Windows API имеет много функций
которые также имеют версии Unicode для
разрешить путь расширенной длины для
максимальная общая длина пути 32 767
персонажи. Этот тип пути
состоит из компонентов, разделенных
обратная косая черта, каждая до значения
вернулся в
lpMaximumComponentLength
параметр
функция GetVolumeInformation
. к
укажите путь расширенной длины, используйте
префикс "\\?\
". Например,
"\\?\D:\<very long path>
". (The
символы <
>
используются здесь для
визуальная четкость и не может быть частью
допустимая строка пути.)
Примечание. Максимальный путь 32 767
символы приблизительны, потому что
Префикс "\\?\
" может быть расширен до
длинная строка системой при запуске
время, и это расширение относится к
Общая длина.
Также можно использовать префикс "\\?\
"
с путями, построенными в соответствии с
универсальное соглашение об именах (UNC).
Чтобы указать такой путь с помощью UNC, используйте
префикс "\\?\UNC\
". Например,
"\\?\UNC\server\share
", где "сервер"
это имя машины и "поделиться"
это имя общей папки.
Эти префиксы не используются как часть
сам путь. Они указывают, что
путь должен быть передан
система с минимальной модификацией,
а это значит, что вы не можете использовать
косая черта для представления пути
разделители, или период для представления
текущий каталог. Вас также
не может использовать префикс "\\?\
" с
относительный путь, следовательно, относительный
пути ограничены MAX_PATH
символы, как указано ранее для
пути, не использующие префикс "\\?\
".
При использовании API для создания
каталог, указанный путь не может
быть настолько длинным, что вы не можете добавить
8.3 имя файла (то есть имя каталога не может превышать MAX_PATH
минус 12).
Оболочка и файловая система имеют
разные требования. Это возможно
создать путь с помощью Windows API
что пользовательский интерфейс оболочки может
не сможет справиться.
Так что простым ответом было бы выделить буфер размером MAX_PATH
, извлечь имя и проверить на наличие ошибок. Если это подходит, вы сделали. В противном случае, если он начинается с "\\?\
", получите буфер размером 64 КБ или около того (приведенная выше фраза "максимальный путь из 32 767 символов является приблизительным" вызывает некоторые сложности, поэтому я оставляю некоторые детали для дальнейшего изучения) попробуйте еще раз.
Переполнение MAX_PATH
, но не начинающееся с "\\?\
", похоже на случай "не может быть". Опять же, что делать, это деталь, с которой вам придется иметь дело.
Также может возникнуть некоторая путаница в отношении ограничения длины пути для сетевого имени, начинающегося с "\\Server\Share\
", не говоря уже об именах из пространства имен объектов ядра, которые начинаются с "\\.\
". В приведенной выше статье ничего не сказано, и я не уверен, может ли этот API возвращать такой путь.