Почему Windows 11 не даёт назвать файл CON: зарезервированные имена MS-DOS

Коротко о главном

В Windows 11 26H2 можно создать файл с именем длиной 200 символов, с пробелами и эмодзи. Но попробуйте назвать файл или папку CON проводник откажется и покажет ошибку «Указанное имя устройства недопустимо» (The specified device name is invalid).

Это не баг и не случайность. CON, PRN, AUX, NUL, COM1 — COM9 и LPT1 — LPT9 зарезервированные имена устройств, которые Windows наследует с 1981 года, со времён MS-DOS 1.0. Microsoft официально не рекомендует использовать их для файлов и папок, а инженер Microsoft Рэймонд Чен объясняет, почему правило живо до сих пор: «потому что все всё ещё полагаются на них».

В этой статье разберём полный список зарезервированных имён, откуда они взялись, как Windows 11 применяет ограничение на уровне Win32, а не NTFS, и почему NUL.txt в проводнике иногда создаётся, хотя документация говорит обратное.

Полный список зарезервированных имён

Microsoft в документации Naming Files, Paths, and Namespaces перечисляет 22 базовых имени, которые нельзя использовать для файлов и папок:

ИмяЧто означало в DOS
CONКонсоль (клавиатура и экран)
PRNПринтер по умолчанию
AUXВспомогательное устройство (обычно последовательный порт)
NULНулевое устройство, «цифровая корзина»
COM1–COM9Последовательные порты
LPT1–LPT9Параллельные порты (принтеры)

Кроме того, Windows резервирует надстрочные варианты: COM¹, COM², COM³, LPT¹, LPT², LPT³. Windows читает ¹, ² и ³ как цифры, поэтому эти имена тоже считаются зарезервированными в любом каталоге.

Имена нечувствительны к регистру: con, Con и CON одно и то же. Добавление расширения не делает имя допустимым: согласно документации, NUL.txt и NUL.tar.gz эквивалентны NUL.

Откуда взялись эти имена: DOS 1.0 и ассемблер

Рэймонд Чен в посте «What’s the deal with those reserved filenames like NUL and CON?» (2003) объясняет происхождение на примере ассемблера.

В DOS 1.0 не было подкаталогов, строчных букв и имён длиннее 8.3. Когда вы запускали ассемблер, он спрашивал имена файлов:

  • Source file: FOO.ASM
  • Listing file: FOO.LST
  • Object file: FOO.OBJ

Расширения добавлялись автоматически. Если вы не хотели создавать листинг, ассемблер всё равно требовал имя файла. Тогда вы печатали PRN и вывод уходил прямо на принтер, минуя диск. Если хотели выбросить вывод, печатали NUL. Если хотели увидеть его на экране CON.

Почему магия работает даже с расширением. Ассемблер не знал о «волшебных» именах. Он пытался создать файл PRN.LST и писал в него. Но DOS перехватывала это имя и направляла вывод на принтер. Если бы расширение отменяло магию, ассемблер добавил бы .LST и имя перестало бы быть волшебным. Поэтому магия сохраняется и с расширением.

Почему магия работает в любом каталоге. В DOS 1.0 был только один каталог то, что сегодня мы называем корневым. Подкаталогов не существовало. Когда они появились, нужно было, чтобы NUL работал и внутри папки иначе нельзя было бы перейти в каталог, запустить ассемблер и напечатать NUL, чтобы выбросить вывод. Поэтому имена стали магическими в каждом каталоге.

Почему они живы в 2026 году. Чен отвечает прямо: «Потому что все всё ещё полагаются на них». Batch-файлы перенаправляют вывод в >NUL, проверяют существование каталога через if exist directoryname\nul, а документация до сих пор советует создавать файлы через copy CON ….

Как Windows 11 применяет ограничение: Win32, а не NTFS

Важный технический нюанс: ограничение накладывает не файловая система, а слой Win32.

NTFS, FAT32 и ReFS сами по себе не запрещают имена CON, NUL или COM1. Запрет реализован в Win32 path parsing механизме, который используется проводником, PowerShell, .NET и большинством приложений.

Что это значит на практике:

  • Через WSL можно создать файл с именем NUL командой touch NUL. Файловая система его примет.
  • Через Win32 API с префиксом \\?\ можно обойти разбор путей и создать файл C:\sample\NUL. Префикс отключает большую часть legacy-разбора путей и передаёт путь почти напрямую драйверу файловой системы.
  • Проводник и стандартные программы по-прежнему будут отказываться создавать такие файлы и могут вести себя непредсказуемо при попытке открыть уже существующий NUL.

Почему CON.txt иногда создаётся. Windows Latest проверил это на Windows 11 26H2 и обнаружил расхождение с документацией: проводник не даёт создать файл с именем просто CON или NUL, но позволяет создать CON.txt или NUL.txt. Это не отменяет правило документация по-прежнему считает такие имена эквивалентными устройству. Но на практике поведение проводника в 26H2 отличается от формальной документации.

Почему это опасно. Если файл NUL.txt всё же создан, приложения, которые интерпретируют NUL как устройство, могут писать в никуда вместо файла или вести себя непредсказуемо. Поэтому даже если проводник позволяет создать такой файл, использовать его в работе не стоит.

Что будет, если попытаться обойти ограничение

Через \\?\. Можно создать файл C:\sample\NUL. Но стандартные инструменты Windows (проводник, del, некоторые API) могут не видеть его или не давать удалить обычным способом. Удалять такие файлы придётся тоже через \\?\ или через WSL.

Через WSL. touch NUL создаст файл в Linux-подсистеме. Из Windows он может отображаться, но открыть или удалить его через проводник, скорее всего, не получится.

Через переименование. Если файл уже существует под другим именем, переименовать его в CON через проводник не получится вы получите ту же ошибку «Указанное имя устройства недопустимо».

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

Почему batch-файлы и скрипты зависят от этих имён

Даже если вы никогда не создаёте файлы CON или NUL, вы, скорее всего, косвенно ими пользуетесь.

Типичные сценарии:

  • Подавление вывода. В batch-файлах команда echo something > NUL выбрасывает вывод в никуда. Это стандартный приём.
  • Проверка существования каталога. Конструкция if exist directoryname\nul проверяет, существует ли каталог, потому что NUL «существует» в любом каталоге.
  • Создание файла с клавиатуры. copy CON file.txt позволяет ввести текст и сохранить его в файл.
  • Вывод на принтер. copy file.txt PRN печатает файл на принтере по умолчанию.

Если убрать поддержку CON, NUL и остальных имён, часть batch-файлов просто перестанет работать. Именно поэтому Microsoft не удаляет это поведение цена совместимости ниже, чем цена сломанных скриптов.

Почему Microsoft не отказывается от ограничения

Причина та же, что и в случае с именами файлов 8.3 и compatibility shim EmulateHeap: Windows развивалась десятилетиями, и миллионы программ, скриптов и документации зависят от её поведения.

Зарезервированные имена это часть контракта совместимости. Они не мешают большинству пользователей, но удаление сломало бы:

  • batch-файлы, которые перенаправляют вывод в NUL;
  • скрипты, которые проверяют каталоги через \nul;
  • старые программы, которые печатают через PRN или LPT1;
  • документацию и инструкции, которые до сих пор используют copy CON.

Microsoft выбирает постепенность и совместимость, а не «чистоту» интерфейса. Поэтому в Windows 11 26H2 вы всё ещё не можете назвать файл CON, хотя можете назвать его эмодзи и двумя сотнями символов.

Часто задаваемые вопросы

Почему именно эти имена, а не какие-то другие?

Потому что в DOS 1.0 они указывали на реальные устройства: CON консоль, PRN принтер, NUL пустое устройство, COM1–COM9 последовательные порты, LPT1–LPT9 параллельные порты. Эти имена были зарезервированы, чтобы программы могли обращаться к оборудованию как к файлам.

Почему NUL.txt иногда создаётся, хотя документация говорит, что нельзя?

Windows Latest проверил это на Windows 11 26H2: проводник не даёт создать просто NUL, но позволяет создать NUL.txt. Это расхождение между поведением проводника и формальной документацией. Документация по-прежнему считает NUL.txt эквивалентом NUL.

Можно ли создать файл CON через WSL или \\?\?

Да. Ограничение реализовано в Win32 path parsing, а не в NTFS. Через WSL (touch NUL) или через Win32 API с префиксом \\?\ файл можно создать. Но работать с ним через стандартные инструменты Windows будет неудобно и опасно.

Что будет, если я всё же создам файл CON?

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

Это касается только файлов или папок тоже?

И файлов, и папок. С точки зрения файловой системы папка это файл со специальным атрибутом, и правила именования применяются к ней так же.

Зарезервированы ли COM0 и LPT0?

В официальном списке Microsoft COM1–COM9 и LPT1–LPT9. Некоторые источники упоминают COM0 и LPT0 как часть legacy-диапазона, но в документации Windows они не указаны как основные зарезервированные имена.

Это когда-нибудь уберут?

Microsoft не объявляла планов по удалению. Учитывая, что ограничение существует с 1981 года и на него до сих пор полагаются batch-файлы и скрипты, оно, вероятно, останется в обозримом будущем.

Что в итоге

Windows 11 26H2 не даёт назвать файл или папку CON, PRN, AUX, NUL, COM1–COM9 или LPT1–LPT9, потому что эти имена зарезервированы со времён MS-DOS 1.0. Они указывали на реальные устройства, и запрет сохраняется ради совместимости с batch-файлами, скриптами и старыми программами.

Ограничение реализовано в Win32 path parsing, а не в NTFS, поэтому обойти его можно через WSL или префикс \\?\. Но созданные таким образом файлы неудобно использовать, и стандартные инструменты Windows могут с ними не работать. Поведение проводника в 26H2 допускает создание NUL.txt, хотя документация считает такие имена эквивалентными устройству, — это ещё один пример того, что совместимость важнее формальной чистоты.

Читайте также на блоге andko.ru

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu