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

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

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

Помимо ограничений по длине, он также позволяет без ограничений использовать точки и пробелы в именах файлов. Например, вы можете иметь файл с именем .., если хотите,

Antimony 25.04.2013 02:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
1
8 544
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Ответ принят как подходящий

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

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

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

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

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

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

Правильно, это отключает больше обработки, чем просто проверку длины. (цитата) передается в систему с минимальной модификацией, что означает, что вы не можете использовать косую черту для обозначения разделителей путей, точку для представления текущего каталога или двойные точки для представления родительского каталога. Поскольку вы не можете использовать префикс «\\? \» С относительным путем, относительные пути всегда ограничены общим количеством символов MAX_PATH. (/Цитировать)

Ben Voigt 09.12.2009 03:24

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

Другие вопросы по теме