Когда в Windows следует использовать префикс имени файла \\\\?\\?

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

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


person kgriffs    schedule 04.12.2008    source источник
comment
В дополнение к ограничениям длины он также позволяет использовать точки и пробелы в именах файлов без ограничений. Например, вы можете иметь файл с именем .., если хотите,   -  person Antimony    schedule 25.04.2013


Ответы (5)


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

person xahtep    schedule 04.12.2008

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

Я управлял файловым сервером, который обычно получал файлы с 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. И снова префикс позволяет вам и вашим сценариям обрабатывать эти файлы.

person itsadok    schedule 09.12.2008
comment
Да, это отключает дополнительную обработку, а не только проверку длины. (кавычки) передается системе с минимальными изменениями, что означает, что вы не можете использовать косую черту для представления разделителей пути, точку для представления текущего каталога или двойные точки для представления родительского каталога. Поскольку вы не можете использовать префикс \\?\ с относительным путем, относительные пути всегда ограничены общим количеством символов MAX_PATH. (/Цитировать) - person Ben Voigt; 09.12.2009

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

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

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

person Rob Kennedy    schedule 04.12.2008

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

person user9876    schedule 19.08.2012

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

person Head Geek    schedule 04.12.2008