Именование файлов, путей и пространства имён
Файловые системы, поддерживаемые 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 см. в разделе " Ограничение длины максимального пути".
Не предполагайте чувствительность к регистру. Например, можно рассматривать имена ОСКАР, Oscar и oscar как одинаковые, даже если некоторые файловые системы, такие как POSIX-совместимые, могут считать их разными. Обратите внимание, что NTFS поддерживает семантику POSIX для конфиденциальности регистра, но это не поведение по умолчанию. Дополнительные сведения см. в статье CreateFile.
Обозначения томов (буквы дисков) аналогично не учитывают регистр. Например, "D:\" и "d:\" относятся к одному и тому же тому.
Используйте любой символ из текущей кодовой страницы для имен, включая символы Юникода и символы из расширенного набора символов (128–255), за исключением следующих:
Следующие зарезервированные символы:
- < (меньше чем);
- > (больше чем)
- : (двоеточие)
- " (двойная кавычка)
- / (косая черта вперед)
- \ (обратная косая черта)
- | (вертикальная полоса или канал)
- ? (вопросительный знак)
- * (звездочка)
Целочисленное значение равно нулю, иногда называемое символом NUL ASCII.
Символы, целые представления которых находятся в диапазоне от 1 до 31, за исключением альтернативных потоков данных, в которых разрешены эти символы. Дополнительные сведения о потоках файлов см. в разделе "Потоки файлов".
Любой другой символ, который не допускает целевая файловая система.
Используйте период в качестве компонента каталога в пути, чтобы представить текущий каталог, например ".\temp.txt". Дополнительные сведения см. в разделе "Пути".
Используйте два последовательных периода (.) в качестве компонента каталога в пути, чтобы представить родительский элемент текущего каталога, например ".. \temp.txt". Дополнительные сведения см. в разделе "Пути".
Не используйте следующие зарезервированные имена для имени файла:
CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT² и LPT³. Кроме того, избегайте этих имен, за которым следует немедленное расширение; Например, NUL.txt и NUL.tar.gz эквивалентны NUL. Дополнительные сведения см. в разделе Пространства имен.
Примечание.
Windows распознает 8-разрядные символы ISO/IEC 8859-1 надстрочные цифры ¹, ² и ³ как цифры и обрабатывает их как допустимые части имен устройств 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 FAT и некоторых типов файловых систем 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 Unicode, чтобы убедиться, что префикс "\\?\" позволяет превысить 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". Этот префикс гарантирует, что следующий путь указывает на истинный корневой путь диспетчера системных объектов, а не на путь, зависящий от сеанса.