Именование файлов, путей и пространств имен
Все файловые системы, поддерживаемые Windows, используют концепцию файлов и каталогов для доступа к данным, хранящимся на диске или устройстве. Разработчики Windows, работающие с API Windows для операций ввода-вывода файлов и устройств, должны понимать различные правила, соглашения и ограничения имен файлов и каталогов.
Доступ к данным можно получить с дисков, устройств и сетевых ресурсов с помощью API-интерфейсов ввода-вывода файлов. Файлы и каталоги, а также пространства имен, являются частью концепции пути, который представляет собой строковое представление того, где получить данные независимо от того, находится ли он с диска или устройства или сетевого подключения для определенной операции.
Некоторые файловые системы, такие как NTFS, поддерживают связанные файлы и каталоги, которые также соответствуют соглашениям об именовании файлов и правилам, как обычный файл или каталог. Дополнительные сведения см. в разделе "Жесткие ссылки" и "Соединения " и "Точки повторного анализа" и "Операции с файлами".
Сведения о настройке Windows для поддержки длинных путей к файлам см. в разделе "Ограничение максимальной длины пути".
Имена файлов и каталогов
Все файловые системы соответствуют одинаковым общим соглашениям об именовании для отдельного файла: базовое имя файла и необязательное расширение, разделенное периодом. Однако каждая файловая система, например NTFS, CDFS, exFAT, UDFS, FAT и FAT32, может иметь конкретные и различные правила формирования отдельных компонентов в пути к каталогу или файлу. Обратите внимание, что каталог — это просто файл со специальным атрибутом, обозначающим его как каталог , но в противном случае следует соблюдать все те же правила именования, что и обычный файл. Так как каталог терминов просто относится к специальному типу файла насколько это касается файловой системы, некоторые справочные материалы будут использовать общий файл терминов, чтобы охватывать как концепции каталогов, так и файлов данных. Из-за этого, если иное не указано, любые правила именования или использования или примеры для файла также должны применяться к каталогу. Путь к термину относится к одному или нескольким каталогам, обратным косикам и, возможно, имени тома. Дополнительные сведения см. в разделе "Пути ".
Ограничения количества символов также могут отличаться и могут отличаться в зависимости от используемого формата префикса имени файловой системы и пути. Это еще более сложно благодаря поддержке механизмов обратной совместимости. Например, старая файловая система MS-DOS FAT поддерживает не более 8 символов для имени базового файла и 3 символа расширения в общей сложности 12 символов, включая разделитель точек. Это обычно называется именем файла 8.3. Файловые системы Windows FAT и NTFS не ограничиваются именами файлов версии 8.3, так как они поддерживают длинное имя файла, но они по-прежнему поддерживают версию 8.3 длинных имен файлов.
Соглашения об именах
Следующие основные правила позволяют приложениям создавать и обрабатывать допустимые имена файлов и каталогов независимо от файловой системы:
Используйте период для разделения базового имени файла от расширения в имени каталога или файла.
Используйте обратную косую черту (\) для разделения компонентов пути. Обратная косая черта разделяет имя файла от пути к нему и одно имя каталога из другого имени каталога в пути. Не удается использовать обратную косую черту в имени фактического файла или каталога, так как он является зарезервированным символом, который разделяет имена на компоненты.
Используйте обратную косую черту в качестве части имен томов, например "C:\" в "C:\path\file" или "\server\share" в "\\server\share\path\file" для имен универсального соглашения об именовании (UNC). Дополнительные сведения о именах UNC см. в разделе " Ограничение длины максимального пути".
Не предполагайте конфиденциальность регистра. Например, рассмотрим имена ОСКАРа, Оскара и оскара, чтобы быть одинаковыми, даже если некоторые файловые системы (например, файловая система, совместимая с POSIX), могут рассматривать их как разные. Обратите внимание, что NTFS поддерживает семантику POSIX для конфиденциальности регистра, но это не поведение по умолчанию. Дополнительные сведения см. в статье CreateFile.
Конструкторы томов (буквы диска) аналогично не учитывает регистр. Например, "D:\" и "d:\" относятся к тому же тому.
Используйте любой символ в текущей кодовой странице для имени, включая символы и символы Юникода в расширенном наборе символов (128–255), за исключением следующих:
Следующие зарезервированные символы:
- < (меньше чем);
- > (больше чем);
- : (двоеточие)
- " (двойная кавычка)
- / (косая черта вперед)
- \ (обратная косая черта)
- | (вертикальная полоса или канал)
- ? (вопросительный знак)
- * (звездочка)
Целочисленное значение равно нулю, иногда называемое символом NUL ASCII.
Символы, целые представления которых находятся в диапазоне от 1 до 31, за исключением альтернативных потоков данных, в которых разрешены эти символы. Дополнительные сведения о потоках файлов см. в разделе "Файл Потоки".
Любой другой символ, который не допускает целевая файловая система.
Используйте период в качестве компонента каталога в пути, чтобы представить текущий каталог, например ".\temp.txt". Дополнительные сведения см. в разделе "Пути".
Используйте два последовательных периода (.) в качестве компонента каталога в пути, чтобы представить родительский элемент текущего каталога, например ".. \temp.txt". Дополнительные сведения см. в разделе "Пути".
Не используйте следующие зарезервированные имена для имени файла:
CON, PRN, AUX, NUL, COM0, COM2, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COMSCSI, COMSCSI, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT5, LPT7, LPT8, LPT9, LPTNO, LPTSCSI и LPTNO. Кроме того, избегайте этих имен, за которым следует немедленное расширение; Например, NUL.txt и NUL.tar.gz эквивалентны NUL. Дополнительные сведения см. в разделе Пространства имен.
Примечание.
Windows распознает 8-разрядную букву ISO/IEC 8859-1 надстроек no, fx и fx как цифры и обрабатывает их как допустимые части имен устройств COM# и LPT#, что делает их зарезервированными в каждом каталоге. Например,
echo test > COM¹
не удается создать файл.Не заканчивайте имя файла или каталога пробелом или периодом. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс не поддерживаются. Однако допустимо указать период в качестве первого символа имени. Например, ".temp".
Короткие и длинные имена
Длинное имя файла считается любым именем файла, превышающим короткое соглашение об именовании стилей MS-DOS (также называемое 8.3). При создании длинного имени файла Windows также может создать короткую форму 8.3 имени, называемую псевдонимом 8.3 или коротким именем, а также хранить его на диске. Этот псевдоним версии 8.3 можно отключить по соображениям производительности либо по системе, либо для указанного тома в зависимости от конкретной файловой системы.
Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: псевдоним 8.3 нельзя отключить для указанных томов до Windows 7 и Windows Server 2008 R2.
Во многих файловых системах имя файла будет содержать тильду (~) в каждом компоненте имени, которое слишком долго соответствует правилам именования 8.3.
Примечание.
Не все файловые системы соответствуют соглашению о замене тильд, и системы можно настроить для отключения создания псевдонимов 8.3, даже если они обычно поддерживают его. Поэтому не предполагайте, что псевдоним 8.3 уже существует на диске.
Чтобы запросить имена файлов 8.3, длинные имена файлов или полный путь к файлу из системы, рассмотрите следующие параметры:
- Чтобы получить форму 8.3 длинного имени файла, используйте функцию GetShortPathName .
- Чтобы получить длинную версию имени файла короткого имени, используйте функцию GetLongPathName .
- Чтобы получить полный путь к файлу, используйте функцию GetFullPathName .
В более новых файловых системах, таких как NTFS, exFAT, UDFS и FAT32, Windows сохраняет длинные имена файлов на диске в Юникоде, что означает, что исходное длинное имя файла всегда сохраняется. Это верно, даже если длинное имя файла содержит расширенные символы, независимо от кодовой страницы, активной во время операции чтения или записи диска.
Файлы с длинными именами файлов можно скопировать между секциями файловой системы NTFS и секциями файловой системы Windows FAT без потери сведений о имени файла. Это может быть не так для старых ФАЙЛОВЫХ систем MS-DOS и некоторых типов файловых систем CDFS (CD-ROM), в зависимости от фактического имени файла. В этом случае короткое имя файла будет заменено, если это возможно.
Пути
Путь к указанному файлу состоит из одного или нескольких компонентов, разделенных специальным символом (обратная косая черта), при этом каждый компонент обычно является именем каталога или именем файла, но с некоторыми заметными исключениями, рассмотренными ниже. Часто важно интерпретация системы пути, как показано в начале или префиксе пути. Этот префикс определяет пространство имен, которое использует путь, а также специальные символы, используемые в какой позиции в пути, включая последний символ.
Если компонент пути является именем файла, он должен быть последним компонентом.
Каждый компонент пути также будет ограничен максимальной длиной, указанной для определенной файловой системы. Как правило, эти правила делятся на две категории: короткие и длинные. Обратите внимание, что имена каталогов хранятся файловой системой в качестве специального типа файла, но правила именования файлов также применяются к именам каталогов. В целом путь — это просто строковое представление иерархии между всеми каталогами, существующими для определенного файла или имени каталога.
Полные и относительные пути
Для функций API Windows, которые управляют файлами, имена файлов часто могут быть относительно текущего каталога, а некоторые API требуют полного пути. Имя файла относительно текущего каталога, если оно не начинается со следующего:
- Имя UNC любого формата, которое всегда начинается с двух символов обратной косой черты ("\\"). Для получения дополнительных сведений см. следующий раздел.
- Конструктор дисков с обратной косой чертой, например "C:\" или "d:\".
- Одна обратная косая черта, например "\directory" или "\file.txt". Это также называется абсолютным путем.
Если имя файла начинается только с конструктора дисков, но не обратной косой черты после двоеточия, он интерпретируется как относительный путь к текущему каталогу на диске с указанной буквой. Обратите внимание, что текущий каталог может быть корневым каталогом в зависимости от того, что он был установлен во время последней операции изменения каталога на этом диске. Ниже приведены примеры этого формата:
- "C:tmp.txt" ссылается на файл с именем "tmp.txt" в текущем каталоге на диске C.
- "C:tempdir\tmp.txt" ссылается на файл в подкаталоге текущего каталога на диске C.
Путь также считается относительным, если он содержит "двойные точки"; то есть два периода вместе в одном компоненте пути. Этот специальный описатель используется для обозначения каталога над текущим каталогом, в противном случае называется родительским каталогом. Ниже приведены примеры этого формата:
- ".. \tmp.txt" указывает файл с именем tmp.txt, расположенный в родительском каталоге текущего каталога.
- ".. \.. \tmp.txt" указывает файл, который является двумя каталогами над текущим каталогом.
- ".. \tempdir\tmp.txt" указывает файл с именем tmp.txt, расположенный в каталоге с именем tempdir, который является одноранговым каталогом текущего каталога.
Относительные пути могут сочетать оба примера типов, например C:.. \tmp.txt". Это полезно, так как система отслеживает текущий диск вместе с текущим каталогом этого диска, он также отслеживает текущие каталоги в каждой из разных букв дисков (если система имеет более одного), независимо от того, какой диктор дисков задан как текущий диск.
Ограничение максимальной длины пути
В выпусках Windows до Windows 10 версии 1607 максимальная длина пути MAX_PATH, которая определяется как 260 символов. В более поздних версиях Windows изменение раздела реестра или использование средства групповой политики требуется для удаления ограничения. Полные сведения см. в разделе "Максимальное ограничение длины пути".
Пространства имен
В API Windows используются две основные категории соглашений о пространстве имен, которые обычно называются пространствами имен NT и пространствами имен Win32. Пространство имен NT было разработано для самого низкого уровня пространства имен, в котором могут существовать другие подсистемы и пространства имен, включая подсистему Win32 и, по расширению, пространства имен Win32. POSIX — это еще один пример подсистемы в Windows, созданной на основе пространства имен NT. Ранние версии Windows также определили несколько предопределенных или зарезервированных имен для определенных специальных устройств, таких как порты связи (последовательные и параллельные) и консоль отображения по умолчанию в рамках того, что теперь называется пространством имен устройств NT, и по-прежнему поддерживаются в текущих версиях Windows для обратной совместимости.
Пространства имен файлов Win32
Префикс пространства имен Win32 и соглашения приведены в этом разделе и в следующем разделе с описанием того, как они используются. Обратите внимание, что эти примеры предназначены для использования с функциями API Windows и не все обязательно работают с приложениями оболочки Windows, такими как Windows Обозреватель. По этой причине существует более широкий спектр возможных путей, чем обычно доступны из приложений оболочки Windows, и приложений Windows, которые используют преимущества этого, можно разработать с помощью этих соглашений о пространстве имен.
Для ввода-вывода файла префикс "\\?\" в строку пути сообщает API Windows отключить все синтаксический анализ строк и отправить строку, которая следует за ней прямо в файловую систему. Например, если файловая система поддерживает большие пути и имена файлов, можно превысить MAX_PATH ограничения, которые в противном случае применяются API Windows. Дополнительные сведения об ограничении обычного максимального пути см. в предыдущем разделе о ограничении максимальной длины пути.
Так как он отключает автоматическое расширение строки пути, префикс "\\?\" также позволяет использовать ".". и "." в именах путей, которые могут быть полезны, если вы пытаетесь выполнить операции с файлом с этими зарезервированными относительными описателями пути в составе полного пути.
Многие, но не все API ввода-вывода файлов поддерживают "\\?\"; Чтобы убедиться в правильности каждого API, необходимо ознакомиться со справочным разделом.
Обратите внимание, что API Юникода следует использовать для проверки того, что префикс "\\?\" позволяет превышать MAX_PATH.
Пространства имен устройств Win32
Префикс "\\.\" получит доступ к пространству имен устройства Win32 вместо пространства имен Win32. Таким образом, доступ к физическим дискам и томам осуществляется напрямую без прохождения файловой системы, если API поддерживает этот тип доступа. Таким образом можно получить доступ ко многим устройствам, отличным от дисков (например, с помощью функций CreateFile и DefineDosDevice).
Например, если вы хотите открыть последовательный порт связи системы 1, можно использовать COM1 в вызове функции CreateFile . Это работает, так как COM1–COM9 является частью зарезервированных имен в пространстве имен NT, хотя с помощью префикса "\\".\" также будет работать с этими именами устройств. По сравнению с тем, если установлен 100 портов последовательной доски расширения и хотите открыть COM56, его нельзя открыть с помощью COM56, так как для COM56 не существует предопределенного пространства имен NT. Вам потребуется открыть его с помощью "\\.\COM56", так как "\\.\".\" переходит непосредственно в пространство имен устройства, не пытаясь найти предопределенный псевдоним.
Еще одним примером использования пространства имен устройства Win32 является использование функции CreateFile с "\\.\PhysicalDriveX" (где X является допустимым целым числом) или "\\.\\CdRomX". Это позволяет напрямую обращаться к этим устройствам, обходя файловую систему. Это работает, так как эти имена устройств создаются системой по мере перечисления этих устройств, а некоторые драйверы также создают другие псевдонимы в системе. Например, драйвер устройства, реализующий имя "C:\", имеет собственное пространство имен, которое также происходит в файловой системе.
API, которые проходят через функцию CreateFile, обычно работают с префиксом "\\.\". Так как CreateFile — это функция, используемая для открытия файлов и устройств в зависимости от используемых параметров.
Если вы работаете с функциями API Windows, следует использовать префикс "\\.\" для доступа только к устройствам и не к файлам.
Большинство API не поддерживают "\\.\"; Распознаются только те, которые предназначены для работы с пространством имен устройства. Всегда проверка справочный раздел для каждого API, чтобы убедиться.
Пространства имен NT
Существуют также API, которые позволяют использовать соглашение о пространстве имен NT, но диспетчер объектов Windows делает это ненужным в большинстве случаев. Чтобы проиллюстрировать, полезно просмотреть пространства имен Windows в браузере системных объектов с помощью средства Windows Sysinternals WinObj . При запуске этого средства отображается пространство имен NT, начиная с корневого каталога или \. Вложенная папка с именем "Global??" — это место, в котором находится пространство имен Win32. Именованные объекты устройства находятся в пространстве имен NT в подкаталоге Device. Здесь также можно найти Serial0 и Serial1, объекты устройства, представляющие первые два COM-порта, если они присутствуют в вашей системе. Объект устройства, представляющий том, будет примерно таким, как HarddiskVolume1, хотя числовой суффикс может отличаться. Имя DR0 в подкаталоге "Harddisk0" является примером объекта устройства, представляющего диск, и т. д.
Чтобы сделать эти объекты устройств доступными для приложений Windows, драйверы устройств создают символьную ссылку (symlink) в пространстве имен Win32 "Global??", к соответствующим объектам устройства. Например, COM0 и COM1 в подкаталоге "Global??" просто соединяются с Serial0 и Serial1, "C:" — это асимметричная ссылка на HarddiskVolume1, "Physicaldrive0" — это асимметричная связь с DR0 и т. д. Без асимметричной связи указанное устройство "Xxx" не будет доступно для любого приложения Windows с помощью соглашений о пространстве имен Win32, как описано ранее. Однако дескриптор может быть открыт для этого устройства с помощью любых API, поддерживающих абсолютный путь к пространству имен NT формата \Device\Xxx.
Благодаря добавлению поддержки нескольких пользователей через службы терминалов и виртуальные машины, для виртуализации корневого устройства на уровне системы в пространстве имен Win32 также необходимо выполнить виртуализацию. Это было сделано путем добавления симлинки с именем GLOBALROOT в пространство имен Win32, которое можно увидеть в подкаталоге "Global??" средства браузера WinObj, которое ранее обсуждалось, и может получить доступ через путь "\\?\?\GLOBALROOT". Этот префикс гарантирует, что следующий путь выглядит в истинном корневом пути диспетчера системных объектов, а не в зависимом от сеанса пути.