В различных ФС допустимое имя файла может иметь различную
длину ц нем могут использоваться различные наборы символов. Так, в RT-H
и RSX-Ц имена файлов состоят из символов кодировки RADIX-50 и имеют длину
9 символов: 6 символов — собственно имя, а 3 — расширение. При этом имя
имеет вид "ХХХХХХ.ХХХ", но символ '.' не является частью имени
— это просто знак препинания. Предполагается, что расширение должно соответствовать
типу данных, хранящихся в файле: SAV будет именем абсолютного загружаемого
модуля, FOR — программы на Фортране, CRH - "файлом информации о системном
крахе", как было написано в одном переволе руководства (попросту
говоря, это посмертная выдача ОС, по которой можно попытаться понять причину
аварии).
В СР/М и ее потомках MS DOS-DR DOS, а также в VMS имена файлов хранятся
в 8-битной ASCII-кодировке, но почему-то разрешено использование только
букв верхнего регистра, цифр и некоторых печатаемых символов. При этом
в системах линии СР/М имя файла имеет 8 символов плюс 3 символа расширения,
а в VMS как имя, так и расширение могут содержать более 32 символов. Все
перечисленные системы используют нечувствительный к регистру букв поиск
Ограничения на формат имени в MS DOS
Любопытно, что MS/DR DOS при поиске в каталоге переводят в верхний регистр
имя, заданное пользователем, но оставляют без изменений имя, считанное
из каталога. Строго говоря, это ошибка: если мы создадим имя файла, содержащее
буквы нижнего регистра, то ни одна программа не сможет открыть или переименовать
такой файл.
Автору довелось столкнуться с такой проблемой при попытке прочитать дискету,
записанную ОС ТС (Экспериментальная UNIX-подобная ОС для Паскаль-машины
N9000). Проблему удалось решить только при помощи шестнадца-теричного
дискового редактора прямым редактированием имен в каталогах. Возможно,
существует и более элегантное решение, но автору не удалось его найти.
Использовать конструкцию *.* бесполезно, потому что, в действительности,
операции над файлами, заданными таким образом, состоят из двух операций:
FindFirst/FindNext, которая возвращает [следующее] имя файла, соответствующее
шаблону, и Open. FindFirst/FindNext возвращает недопустимое имя файла
и Open не может использовать его. Программа CHKDSK не возражает против
имен файлов в нижнем регистре. Строго говоря, это тоже ошибка. Все остальные
способы, так или иначе, сводятся к прямой (в обход ДОС) модификации ФС.
Кроме того, любопытных эффектов можно достичь, попытавшись создать файл
с именем, содержащим русские буквы.
Наибольшим либерализмом в смысле имен отличаются ОС семейства Unix, в
которых имя файла может состоять из любых символов кодировки ASCII, кроме
символов '\000' и V, например, из восьми символов перевода каретки. При
этом '\000' является ограничителем имени, а V — разделителем между именем
каталога и именем файла. Никакого разделения на имя и расширение нет,
и хотя имена файлов с программой на языке С заканчиваются ".с",
а объектных модулей — ".о", точка здесь является частью имени.
Вы можете создать файл с именем "gcc-2.5.8.tar.gz". В UNIX SVR3
длина имени файла ограничена 14 символами, а в BSD UNIX, Linux и SVR4—
только длиной блока на диске, т. е. 512 байтами или более. При этом нулевой
символ считается концом имени в каталоге.
Возможность использовать в именах неалфавитные символы типа перевода каретки или ASCII EOT (End Of Transmission) кажется опасным излишеством. На самом деле:
В некоторых случаях процесс набора имени файла в командной строке превращается в нетривиальное упражнение, потому что shell (командный процессор) рассматривает многие неалфавитные символы как команды. Но надо отметить, что, правильно используя кавычки и символ '\', пользователь может передать команде аргумент, содержащий любые символы ASCII, кроме \000".
Длинные имена файлов в ОС семейства
СР/М
В последнее время в ОС стало модным поддерживать длинные имена файлов.
Отчасти это, возможно, связано с тем, что производители ПО для персональных
компьютеров осознали, что системы семейства Unix являются потенциально
опасными конкурентами, а длинные имена файлов традиционно считаются одним
из преимуществ этого семейства.
Например, OS/2, использующая файловую систему HPFS (High Performance File
System — высокопроизводительная файловая система), поддерживает имена
файлов длиной до 256 символов, содержащие печатаемые символы и пробелы.
Точка считается частью имени, как и в UNIX, и можно создавать имена, содержащие
несколько точек. Аналогичную структуру имеют имена в NTFS, используемой
в Windows NT/2000/XP, VFAT (реализация файловой системы FAT16, используемая
в Windows 95/98/ME) и FAT32.
Описанные ОС при поиске файла приводят к одному регистру
все алфавитные символы в имени. С одной стороны, это означает дополнительное
Удобство для пользователя — при наборе имени не нужно заботиться о регистре
букв, с другой — пользователь не может создать в одном каталоге файлы
"text.txt" и "Text.txt". Из-за этого, например, нельзя
использовать принятое в UNIX соглашение о том, что файл на языке С имеет
расширение "с", а на языке C++ — "С".
Главная же проблема, возникающая при работе с нечувствительными « п гистру
именами, — это преобразование регистра в именах, использующи национальные
алфавиты: русский, греческий, японскую слоговую азбуку т. д. Файловая
система, поддерживающая такие имена, должна учитыват языковые настройки
ОС, что создает много сложностей, в том числе и при считывании удаляемых
носителей, записанных в одной стране, где-нибудь за границей. В системах
семейства Win32 эта проблема решена за счет хранения имен в формате Unicode.
Некоторые ОС, например, RSX-11 и VMS, поддерживают также номер версии
файла. В каталоге может существовать несколько версий файла с одним именем;
если номер версии при открытии файла не задается, то открывается последняя
версия.
Версии файла очень удобны при разработке любых объектов, от программ или
печатных плат до книг: если вам не понравились изменения, внесенные вами
в последнюю версию, вы всегда можете откатиться назад. Ныне функцию хранения
предыдущих версий изменяемых файлов и управляемого отката к ним реализуют
специальные приложения, системы управления версиями
(version control system) (RCS, CVS и др.).