
Комментарии 74
Надо назвать диск русской Х и потом требовать разобраться, почему не видно в explorer
Диск С
Даже если какой-то файловый менеджер будет этот диск видеть, пользователь будет озадачен)
и зачем мне два диска цэ - удалюка я первый
Так это ж анекдот времён ранних нортоноподобных оболочек.
так так тааак.
слуушаем...
Оказывается, С и C - разные буквы. С одной программа работает, с другой нет.
«Один пользователь рассказывает наладчику:
Я включаю комп, а там с одной стороны диск C: и с другой - тоже диск C:. Ну, думаю, зачем мне два одинаковых диска C:. Я взял и один снёс».
Тема интересная, особенно если попробовать раскрутить в сторону скрытия каких-либо объектов от антивирусов и т.д. Вполне может быть, что какие-то вредоносы уже это используют.
Хотелось бы почитать аналогичную статью про имена файлов в NT (NTFS). Есть там ряд ограничений как по набору символов, так и по возможному расположению их (пробелы, точки в конце имени). И судя по всему, эти ограничения со временем менялись.
вредоносы прячутся внутри файловых систем
Особенно с усечением кодов символов. Вроде создания диска из system32 с экзотическим названием, которое усечется до C, а дальше вытягивать или писать данные как бы в другой диск. Интересный вектор атаки, но проверять мне лень :)
Зато поддерживаются Юниккодные управляющие символы. "Exexe.jpg" может на самом деле быть "Ex.jpg.exe" с символом чтения справа влево.
Просвещайтесь:
ДискЦ:/ - так можно?
Забавная статья. Только великовата.
Попробую пояснить, почему так сложилось. По поводу букв. В DOS было принято обозначение физических дисков латинскими буквами. A, B шли под флоппи диски, остальные уходили под появившиеся в ПК позже жесткие диски, ну и под зоопарк приводов для переносных хранилищ. С развитием Windows появилась возможность давать папкам псевдонимы в виде букв дисков. Проблема в том, что вот это обозначение дисков латиницей это вещь основополагающая, принята "по умолчанию". Разработчикам просто в голову не придет, что кто-то удосужится назвать диск спецсимволом. Косяк, да.
С развитием Windows появилась возможность давать папкам псевдонимы в виде букв дисков
В DOS 3.0 subst уже был, я им пользовался
Разработчикам просто в голову не придет, что кто-то удосужится назвать диск спецсимволом
В те годы 640 кБ хватало всем, поэтому экономили каждый байт, делая систему минимально достаточной и с разумным заделом на будущее. А теперь легаси как со стороны ОС, так и со стороны ПО не позволяют так радикально протащить спецсимволы или вообще юникод в имена дисков - до сих пор даже кириллицу в пути к файлу ещё не всё ПО допускает, поэтому и проблемы с такими именами дисков имхо тоже растянутся на десятилетия...
В те годы 640 кБ хватало всем, поэтому экономили каждый байт, делая систему минимально достаточной и с разумным заделом на будущее.
RT-11 работала на в десять раз меньшем объёме и при этом позволяла иметь имена дисков до трёх символов, вместо одного, как в CP/M с потомками типа MS-DOS. Поэтому во времена 640kB оправдания этому маразму уже не было.
Но MS-DOS 1.0 должна была работать на системе с 16kB. Вот там ещё можно было подумать...
Так как этот прикольный диск называется? +:\ или +: или + ?
Диск цэ, кстати, называется одной буквой, а не C:\
Мне кажется, в статье путают название и отображение.
Диск, конечно, имеет имя C, но запись C: используется, чтобы не писать "диск C".
(+:\ - это, разумеется, путь к корню диска +:.)
Даже нет. В первую очередь, C: - это консольная команда, переключающая текущий диск на диск C.
Интересно, как в эту парадигму грамматики путей уложить то, что и A:\AUTOEXEC.BAT, и A:AUTOEXEC.BAT указывают на один и тот же файл?
А это не одно и то же.
Грубо
./file vs /file
Не на один и тот же. A:\AUTOEXEC.BAT указывает на файл, находящийся в корне диска, а A:AUTOEXEC.BAT - на файл, находящийся в текущей папке на диске E:
Быстрая проверка в cmd.exe
Microsoft Windows [Version 10.0.19045.6456]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
e:\Download>test
passed.
e:\Download>d:
d:\Games>test
"test" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
d:\Games>e:test
passed.
d:\Games>cd e:
e:\Download
d:\Games>cd e:\
d:\Games>cd e:
e:\
d:\Games>e:test
"e:test" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.Б-р... Видя такие извращения меня сразу накрывают птср флешбэки, когда ловили ошибку суть которой была в том, что на вход нам прилетал "широкий пробел" вместо "пробел"😖
Интересно, Windows когда-нибудь отойдёт от концепции отдельных дисков, помеченных буквой? Мне кажется, структура Unix-like систем выглядит более современной.
А зачем сливать всё в кучу?
Когда раздел монтируется как директория, ему можно задать осмысленное имя, а не одну букву. Когда дисков много, это может быть удобно. Я, разумеется, не могу являться экспертом в этой области, не являясь разработчиком операционных систем, это скорее вкусовые предпочтения. У меня буквы дисков в Windows ассоциируются с временами дремучего MS-DOS с его многочисленными ограничениями.
Зачем монтировать диск в одно дерево и прятать где-то внутри структуры папок? Бред же.
Во-вторых, у людей обычно хватает памяти на 3-5 дисков. Вполне норм. А у кого памяти не хватает, можно воспользоваться командой, с которой началась статья.
С точки зрения Unix не бред, потому что все объекты операционной системы это файлы. Устройства в /dev, процессы в /proc, смонтированные разделы в /mnt, все просто и логично.
Но зачем это всё сливать в одно дерево? Не логичнее ли разделить его по разным логическим группам?
И назвать группы просто и понятно. C:, D:..
Зачем монтировать диск в одно дерево и прятать где-то внутри структуры папок?
Потому что важней структура папок, а не то, на каком физическом носителе они расположены. Это позволяет размещать данные на разных носителях не меняя способов доступа к ним (адресации).
Но зачем это всё сливать в одно дерево? Не логичнее ли разделить его по разным логическим группам?
А зачем логику привязывать к букве? Разве в букве диска есть какой-то логический смысл? Это же просто способ адресации, как папка.
В Unix всё и так отлично поделено на логические группы не зависимо от физического расположения: /dev, /run, /root, /etc, /var, /tmp, /home и т.д. В каждой папке определённый тип объектов.
Физическое расположение важно. В Windows часто ставят программы не в системный каталог, а на отдельный диск (на системном часто заканчивается место). Диски в системе могут быть зашифрованы, и тогда после загрузки системы часть каталогов будет доступна, а часть нет (пока не введёшь пароль). Плюс сами диски могут ломаться и сыпаться, и хочется явно определить на них данные, которые мы готовы или не готовы потерять.
Ага, и все ссылки на эти данные становятся зависимы от буквы этого диска.
Вы описываете важность для пользователя. А я про важность для системы.
С точками монтирования точно также, только удобнее ;) Не D: , а /mnt/games. Windows, кстати, тоже умеет в точки монтирования.
В Windows часто ставят программы не в системный каталог, а на отдельный диск (на системном часто заканчивается место).
В Unix тоже.
Диски в системе могут быть зашифрованы, и тогда после загрузки системы часть каталогов будет доступна, а часть нет (пока не введёшь пароль).
Точно так же, с учётом поддеревьев.
Плюс сами диски могут ломаться и сыпаться, и хочется явно определить на них данные, которые мы готовы или не готовы потерять.
Если хочется залезть в эти детали - mount даёт список текущих монтирований. В случае LVM соответственно рассматривается, что входит в volume group.
Зачем монтировать диск в одно дерево и прятать где-то внутри структуры папок? Бред же.
Бред или нет, а в Windows это сделали, причём ещё менее понятно, по ссылке описано. Одна иерархия, в которой \\?\ задаёт, что дальше будет файл из файловой системы, а за пределами этого поддерева разные спецобъекты.
Но это сделали внутри, может это удобнее разработчикам ОС. Это не сделали для юзеров, которым удобнее ощущать чёткое разделение где у них что лежит.
Я бы насчёт этого "удобнее" слегка поспорил. Во-первых, удобнее разделять постоянные и временные носители, поэтому в современных линуксах подкаталоги для вторых создаются в /media/$user/, а графические средства типа Dolphin или Windows Explorer это всё равно обобщают. Во-вторых, c динамическими дисками под LDM это уже становится заметно менее важным. В-третьих, как-то не очень смысла спамить общее пространство намонтированными структурами типа того, что в Ubuntu заводятся для каждого снапа...
Если бы вместо букв и/или имён дисков была своя иерархия, которая бы позволяла делать что-то вроде /disk/root:/windows/explorer.exe с небольшим количеством алиасов типа root вместо /disk/root, то я бы вполне согласился.
Мне, если честно, концепция букв нравится больше, чем сваливание всего в одну структуру. Ну, ситуации конечно разные бывают, и иногда удобнее монтировать сетевую папку в другую папку. Но для домашнего или мелко-офисного использования удобнее отдельные буквы на каждое устройство
Это должны быть не буквы, а имена произвольной длины (хотя бы до 8 символов).
Самое смешное, что изначально такие имена устройств поддерживались, всякие там CON: и LPT2:
Не-а, там другой механизм. Они не в том же пространстве, что имена дисков, а как бы встроены в любой каталог, причём с любым суффиксом, что само по себе диверсия. В RSX-11 с компанией они логично размещались, например, copy dk0:foo.txt lp0: (не помню точного названия для принтера) давало, что драйверу принтера уходило имя файла (внутри второй аргумент превращался в lp0:foo.txt), он мог выбрать от этого режим печати, нарисовать заголовки и так далее...
И не "поддерживались", а поддерживаются и сейчас, если путь не изначально передан в WinAPI как UNC.
Do not use the following reserved names for the name of a file:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT², and LPT³. Also avoid these names followed immediately by an extension; for example, NUL.txt and NUL.tar.gz are both equivalent to NUL. For more information, see Namespaces.
Как вам устройство COM¹, неявно присутствующее в любом каталоге? 😱
В UNC режиме (префикс \\?\) этот разбор на такие имена выключается, вместе со многими другими (нельзя /, только \; нельзя относительные пути, только абсолютные).
Согласен. Понятно, что где лежит и какие файлы на каком диске. Это и безопаснее с точки зрения сохранности данных, чтобы не гадать, условно какой диск посыпался и на каком из носителей лежит n-ный файл.
Для домашнего использования буквы гораздо удобнее и практичнее. Для каких-нибудь серверов - да, могут быть удобнее unix-подобные fs и обозначения, ибо там нередко много дисков, обозначать которые может быть удобнее определённой последовательностью символов - имя+номер или тп.
Это и безопаснее с точки зрения сохранности данных, чтобы не гадать, условно какой диск посыпался и на каком из носителей лежит n-ный файл.
Достаточно бесполезное знание. Если физический диск 1 - и так все очевидно. Если raid - наоборот. Пережиток тех времен, когда система на диске С а игры на диске Д
чтобы не гадать, условно какой диск посыпался и на каком из носителей лежит n-ный файл.
Гадать не надо. Команда mount расскажет всё что надо.
Исходно эта схема с одной буквой получена упрощением той, что была в операционных системах RSX-11 и родственных, где название диска могло содержать до 3 символов не считая двоеточия, например, DK0:, SY:, и алиасы были штатным свойством (SY был алиасом на системный диск). Когда делалась CP/M, уплощили до одной. Потом не вернули обратно всё время жизни DOS и Windows. Вот это действительно неудобно, букв слишком мало и в них слишком легко получить конфликты.
Unix система хороша, но не напрямую одной иерархией: внутри она совершенно не обязательно одна. С современными средствами можно, например, запустить процесс, у которого корнем будет /opt/foo хозяйской системы, а /var/db/foo будет доступен через отдельный дескриптор, и все доступы надо будет делать относительно него через *at() вызовы, как openat(), mkdirat() и тому подобные. В Windows так не работало бы: Windows внутри всегда требует полного пути и итерирует от общего корня.
где название диска могло содержать до 3 символов не считая двоеточия, например, DK0:, SY:, и алиасы были штатным свойством (SY был алиасом на системный диск). Когда делалась CP/M, уплощили до одной. Потом не вернули обратно всё время жизни DOS и Windows.
Ну не совсем так. Название диска включала в себя драйвер и потом уже номер диска. DX[0,1...] это восьмидюймовые дискеты, MX, MY - пятидюймовые.
Это всё легаси. Если очень надо, через диспетчер дисков можно задать диску точку монтирования в виде выбранной папки. (Можно даже несколько.)
Смонтировать диск в папку и в Windows можно:
В управлении дисками для раздела можно назначить как букву, так и путь к папке.
Вот пример на картинке для DVD привода попробовал назначить путь, а букву диска вообще убрал, теперь содержимое диска доступно по пути "/CD".

Цифры можно использовать?
Во времена DOS имя диска любой символ диапазона 0x40...0x5F (&, A-Z, [, \, ], ^, _). Диск &: не рекомендовался к использованию. Диски [:, ]: создавались и обрабатывались без проблем.
explorer.exe в эти игры не играет
Расходимся, нас обманули )
В качестве букв диска в Windows может использоваться не только латиница