В Windows, когда вы должны использовать "\\?\" префикс имени файла?

я наткнулся на библиотеку c для открытия файлов с именем Unicode. Перед открытием файла он сначала преобразует имя файла в путь, добавив"\?". Есть ли какая-либо причина сделать это, кроме как увеличить максимальное количество символов, разрешенных в пути, за эта статья msdn?

похоже на эти"\? "пути требуют версии Unicode API Windows и стандартной библиотеки.

5 ответов


Да, это только для этой цели. Однако вы, вероятно, увидите проблемы совместимости, Если вы решите создать пути по длине MAX_PATH. Например, оболочка проводника и командная строка (по крайней мере, на XP, я не знаю о Vista) не могут обрабатывать пути по этой длине и будут возвращать ошибки.


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

я управлял файловым сервером, который обычно получал файлы с path_length > MAX_PATH. Видите ли, пользователи видели файлы как H:\myfile.txt, но на сервере это было на самом деле H:\users\username\myfile.txt. Поэтому, если пользователь создал файл с точно MAX_PATH символов, на сервере это было MAX_PATH+len("users\username").

(создание файла с символами MAX_PATH не так уж редко, поскольку при сохранении веб-страницы в Internet Explorer в качестве имени файла используется заголовок страницы, который может быть довольно длинным для некоторых страниц).

кроме того, совместное использование диска (через сеть или usb) с Mac или Linux-машиной, вы можете найти себе файлы с именами, такими как con, prn или lpt1. И опять же, префикс позволяет вам и вашим скриптам обрабатывать эти файлы.


Я думаю, что первое, что нужно отметить, это"\\?\" не путь путь UNC. Вы были более точны во второй раз, когда назвали его UNC -стиль путь. Но даже тогда сходство возникает только из-за двух обратных косых черт в начале. Это не имеет никакого отношения к UNC. Это подкрепляется тем фактом, что вы должны использовать еще больше символы, чтобы получить UNC-путь с "\\?\" префикс.

Я думаю, что у вас есть все причины для использования эти префиксы. Он поднимает ограничение максимальной длины, как описано в приведенной вами статье. И это относится только к путям Unicode; пути, отличные от Unicode, не избегают ограничения, используя этот префикс.

следует отметить, что префикс не разрешен для относительных путей, только для абсолютных. Возможно, вы захотите дважды проверить, что ваша библиотека C соблюдает это ограничение.


а также позволяет более длинные пути,"\\?\ "префикс также позволяет использовать файлы и имена каталогов, такие как" con "и"aux". Обычно Windows интерпретирует их как старомодные устройства DOS.


Я пишу код Windows с 1995 года, и хотя я знаю этот префикс, я никогда не находил причин его использовать. Увеличение длины пути за MAX_PATH кажется, единственная причина для этого, и ни я, ни кто-либо из клиентов моих программ никогда этого не делали, насколько мне известно.