Файл

Файл (англ. file) — абстракция операционной системы, представляющая собой набор данных, связанный в единое целое, доступ к которому осуществляется средствами файловых API[1]. Файл может быть записан на носитель информации, передан по каналам связи или получен иным способом, например из другого файла, но вне зависимости от этого операционная система предоставляет стандартные средства для манипулирования файлами, отделяющие доступ к файлу от реализации хранилища файлов[2].
Хранение файлов на носителях информации реализуется посредством файловых систем. Файловая система представляет собой специализированную базу данных, предназначенную для хранения файлов. Для однозначного доступа к файлу файловые системы присваивают файлам имя, а также (в большинстве иерархических файловых систем) путь[2]. Также файловые системы могут ассоциировать с файлом метаданные, также называемые атрибутами — вспомогательные данные о файле. Метаданные могут включать информацию о внутренней структуре файла и правилах его обработки (тип файла), разрешения на выполнение тех или иных операций с файлами (чтение, запись, исполнение как программы) в том числе для отдельных пользователей и групп, метки времени и т.д.
Этимология

Слово англ. file происходит от лат. filum («нить, струна») и обозначало подшитый набор страниц или документов[3]. В вычислительной технике оно поначалу использовалось для обозначения набора сущностей, каким-либо образом связанных. В частности, файлом называли данные, хранящихся на электронно-лучевой трубке[4], колоду перфокарт[5]. Диски IBM 350, использовавшиеся, например, в машине IBM 305, назывались дисковым файлом[6][7]. Современное значение появилось при обработке экономических данных[8] и вошло в широкое употребление с появлением систем с разделением времени. Тем не менее, слово «файл» всё ещё может употребляться не только в значении набора данных: к примеру, часть процессора, содержащая регистры называют регистровым файлом.
История

Ранние компьютеры не имели стандартизированных методов доступа к данным. Запущенной программе была доступна вся память машины и программист мог распоряжаться ей на своё усмотрение. Ввод, вывод и распределение памяти контролировался либо вручную оператором, либо непосредственно из прикладной программы, из-за чего прикладные программы не могли быть перенесены на другую машину, если она отличалась объёмом памяти, адресацией или реализацией какого-либо устройства памяти.
Причины появления концепций файла и файловой системы связаны с развитием вычислительной техники:
- Появление магнитных дисков как устройств хранения большого объёма информации, допускающих произвольный доступ к данным;
- Появление операционных систем, предоставляющих прикладному программисту унифицированные интерфейсы (API) для взаимодействия программы с аппаратными средствами машины, а пользователю — средства человеко-машинного взаимодействия (интерфейс пользователя);
- Появление библиотек программ, хранящихся в долговременной памяти и доступных в любой момент, а не требующих предварительной загрузки с перфокарт или лент;
- Появление систем с разделением времени, когда на одной машине параллельно могли выполняться несколько задач. Требовалось отделить данные одного процесса от другого, чтобы он не мог случайно или нарочно их испортить;
- Общее увеличение парка ЭВМ требовало, чтобы программы были переносимыми, а не жёстко привязанными к конкретной машине.
В упрощённом виде файлы стали использоваться с появлением ленточных накопителей: на них файлом называли набор данных, ограниченный метками начала и конца файла. На одной ленте уже могло быть записано несколько файлов, а также один файл мог быть записан на нескольких лентах[9]. Такой файл мог не иметь заголовка, а значит имени, по которому к нему можно было бы обратиться.
Одной из первых систем, в которых стала использоваться современная концепция файла, стала продемонстрированная в 1961 году система Compatible Time-Sharing System[англ.], где прикладные программы обращались не к физическому запоминающему устройству, а к «виртуальному устройству памяти», к которому можно было обращаться по имени, являющемуся по сути файлом в современном понимании. Имена этих «устройств» состояли из двух частей, «основного имени» и «дополнительного имени» (последнее существует до сих пор как расширение имени файла)[10][11][страница?].
Концепция
Задача файла в том, чтобы представить некий набор данных как самостоятельную сущность, к которой можно обратиться по имени или каким-то другим способом, и отделить его от других аналогичных наборов данных. В первую очередь это необходимо при долговременном хранении данных, чтобы не привязываться к конкретному запущенному процессу, а значит не потерять данные после завершения процесса — чтобы уничтожить файл, нужно сделать это явным образом. Файл предоставляет возможность абстрагироваться от физического местонахождения этих данных: чтобы получить доступ ко всему файлу или какой-то его части, от прикладной программы не требуется знать, на каких дорожках и секторах расположены данные этого файла; не нужно контролировать положение головок, осуществлять контроль целостности считываемых данных и контроль правильности записи; при записи не нужно контролировать, является ли место куда ведётся запись свободным, или на нём располагаются какие-то другие данные, которые не следует портить — всем этим занимается операционная система[12].
По содержимому файлы иногда условно делят на текстовые и двоичные. Текстовыми называют файлы, в которых закодирован текст в ASCII или аналогичной кодировке, что делает его условно человеко-читаемым, в то время как двоичными называют все остальные типы файлов[13]. Некоторые операционные системы могут также поддерживать особые разновидности файлов — файлы, разбитые на блоки фиксированной длины (как правило, 80 или 132 символа) — для совместимости с системами считывания перфокарт, а также файлы с внутренней иерархической структурой, распознаваемой файловым API — последние используются в некоторых операционных системах мейнфреймов[14]. С точки зрения содержащейся в файле информации, файл подобен книге, где блок страниц собран под единым переплётом, а внутренняя структура — разбивка на разделы и главы, — может быть различной[9].
Операционные системы как правило предоставляют доступ к файлу на двух уровнях абстракции: закрытый и открытый файл.
Операции, доступные без открытия файла
Не будучи открытым, файл является атомарным объектом файловой системы. Данный уровень скрывает как физическую реализацию файла, так и его внутреннее содержание. На этом уровне абстракции можно найти файл по имени, проверить его метаданные, а также произвести над ним какие-либо операции — скопировать, переименовать, изменить путь к файлу, удалить. Чтобы получить доступ к внутреннему содержимому, его необходимо открыть.
Открытие файла
Доступ к содержимому после открытия файла может быть осуществлён разными способами:
- Копирование содержимого файла в оперативную память. Такой способ хорошо работает с небольшими по размеру файлами, однако при большом размере файла памяти может быть недостаточно, либо сама по себе загрузка файла может занять много времени. Кроме того, изменения, внесённые извне не сразу становятся доступны — для этого программа должна подписаться на событие, сигнализирующее об изменении файла и перечитывать файл.
- Отображаемый в память файл — более совершенный способ, доступный для архитектур, поддерживающих виртуальную память. В этом случае файл может быть загружен в память не сразу и не целиком, подгружаясь по мере необходимости и производя запись в файл при записи в соответствующие ячейки памяти.
- Последовательное чтение/запись — в этом случае после открытия файла и опционально — указания на конкретное место, с которого нужно начинать чтение или запись (операция seek), производится чтение/запись содержимого файла по одному символу[15]. Если достигнут конец файла, очередная операция чтения возвращает маркер конца файла, либо вызывает исключение. При записи, если достигнут конец файла, его размер увеличивается на размер записи. Такой способ доступа к файлам удобен для файлов, имеющих последовательную природу — видео- и аудиозаписей, журналов.
- Произвольный доступ, позволяющий при каждой операции чтения или записи указывать конкретное место, к которому происходит обращение[15]. Как правило, такой способ доступа используется для работы с большими файлами, имеющими сложную структуру — например, с базами данных.
При открытии файла необходимо указать способ доступа и какие операции над файлом будут производиться (чтение, перезапись, дополнение в конец). Система проверяет наличие у запустившего процесса прав на запрошенную операцию. Если проверка прав прошла успешно, система предоставляет интерфейс для доступа к файлу. Чаще всего в современных ОС используется так называемый дескриптор файла — уникальный идентификатор, по которому система распознаёт обращение к конкретному файлу[16]. После завершения всех операций файл полагается закрыть, чтобы закончить все операции записи и предоставить доступ к файлу другим процессам, если не разрешено совместное использование файла[17].
Метаданные файлов
Имя файла
В большинстве файловых систем имя файла используется для указания, к какому именно файлу производится обращение. В различных файловых системах ограничения на имя файла сильно различаются: может поддерживаться различная максимальная длина как имени файла, так и пути к нему, могут быть запрещены те или иные символы. Как правило, имя файла должно быть уникальным в пределах одного каталога, при этом некоторые файловые системы могут считать заглавные и строчные буквы одним и тем же символом, другие — нет. Также ограничения на имена файлов могут быть обусловлены не файловой, а операционной системой, например Windows не позволяет создать на любой файловой системе файлы со спецсимволами >
, <
, |
, ?
, *
, /
, \
, :
, "
в названии, даже если они экранированы, а также зарезервированные имена устройств, однако в Linux запрещены только /
и нулевой символ — также на любой файловой системе.
В некоторых файловых системах можно создавать и использовать файлы без имени. Такие файлы всегда являются временными[источник не указан 20 дней]. Их основные преимущества: при создании не может возникнуть конфликта имён и их нельзя найти в их каталоге по имени. В остальном это полноценные файлы.
Тип файла
Тип файла — это информация о его внутренней структуре и способе обработки. Существуют несколько способов определения типа файла:
- С помощью расширения — части имени файла, отделённого от названия точкой. Иногда практикуется указание нескольких расширений для одного файла[18], например .tar.bz — означает, что файл является архивом (.tar), сжатым с помощью алгоритма bzip. Соответственно, чтобы открыть этот файл, нужно сначала распаковать его утилитой bzip, а затем — открыть с помощью утилиты tar;
- С помощью специального поля, содержащего тип файла. Несмотря на то, что с точки зрения конечного пользователя расширение в файловых системах FAT и NTFS ведёт себя как часть имени файла, на самом деле оно хранится в отдельном поле;
- Через MIME-тип. Данный способ определения типа файла распространён при передаче файлов через системы электронной почты и интернет. Браузеры и почтовые клиенты игнорируют расширения файлов, определяя тип открываемого файла именно через механизм MIME;
- Через сигнатуру — небольшой набор данных, находящийся в начале файла. Как правило, данный способ не используется самостоятельно, а сочетается с одним из вышеперечисленных.
Основные атрибуты
В некоторых файловых системах, таких как NTFS, предусмотрены атрибуты (обычно это бинарное значение «да»/«нет», кодируемое одним битом). Во многих современных операционных системах атрибуты практически не влияют на возможность доступа к файлам, для этого в некоторых операционных и файловых системах существуют права доступа.
Название атрибута | Перевод | Значение | Файловые системы | Операционные системы |
---|---|---|---|---|
Read only | только для чтения | файл запрещено редактировать | FAT32, FAT12, FAT16, NTFS, HPFS, VFAT | DOS, OS/2, Windows |
System | системный | критический для работы операционной системы файл | FAT32, FAT12, FAT16, NTFS, HPFS, VFAT | DOS, OS/2, Windows |
Hidden | скрытый | файл скрывается от показа, пока явно не указано обратное | FAT32, FAT12, FAT16, NTFS, HPFS, VFAT | DOS, OS/2, Windows |
Archive | архивный (требующий архивации) | файл изменён после резервного копирования или не был скопирован программами резервного копирования; при изменении файла ОС автоматически устанавливает этот атрибут | FAT32, FAT12, FAT16, NTFS, HPFS, VFAT | DOS, OS/2, Windows |
SUID | Установка пользовательского ID | выполнение программы от имени владельца | ext2 | Unix-подобные |
SGID | Установка группового ID | выполнение программы от имени группы (для каталогов: любой файл созданный в каталоге с установленным SGID, получит заданную группу-владельца) | ext2 | Unix-подобные |
Sticky Bit | липкий бит | изначально предписывал ядру не выгружать завершившуюся программу из памяти сразу, а лишь спустя некоторое время, чтобы избежать постоянной загрузки с диска наиболее часто используемых программ, в настоящее время в разных ОС используется по-разному | ext2 | Unix-подобные |
Время
Для файла могут быть определены временные метки создания, последней модификации, последнего доступа и другие.
Владелец и группа файла
В некоторых файловых системах предусмотрено указание на владельца файла и группу-владельца.
Права доступа
В некоторых файловых системах предусмотрена возможность для ограничения доступа пользователей к содержимому файла. В Unix-подобных операционных системах для файлов ранее обычно выделяли три типа прав: на запись, чтение и выполнение. Каждое право задаётся раздельно для владельца, для группы и для всех остальных. ACL позволяет использовать более детальное разделение и прав, и пользователей.
В операционных системах Windows NT при работе с файловой системой NTFS права́ доступа задаются явно для пользователей или групп или наследуются от вышестоящих объектов. Права́ в себя включают право на чтение, запись, исполнение, удаление, смену атрибутов и владельца, создание и удаление подпапок (для папок) и чтение прав доступа и другие как в POSIX. Каждое право может быть задано как разрешением, так и запретом. Запрет имеет больший приоритет, чем разрешение в отличие от POSIX.
Особые разновидности файлов
Существует несколько особых разновидностей файлов:
- Каталог (он же — папка или директория) — необходим для группировки файлов и организации их в иерархическую структуру[19]. Файл может находиться в корне файловой системы, либо привязан к одному из каталогов (в случае поддержки файловой системой жёстких ссылок — и к нескольким). Как правило операционная система позволяет при выбрать для процесса какой-либо каталог как «текущий» или «рабочий», в этом случае файлы, относящиеся к этому каталогу доступны просто по имени, или с префиксом «./», а для доступа к другим файлам необходимо указать последовательность каталогов, ведущих к ним (так называемый путь) либо от текущего каталога (относительный путь), либо от корня файловой системы (абсолютный путь)[20].

- Архив — в отличие от каталогов, архив сам представляет собой файл, непосредственно содержащий в себе другие файлы. Проще говоря, архив — это подобие файловой системы, заключённой внутри файла, однако в отличие от образов, эта система не предназначена для развёртывания на носителе информации. Архивы как правило используются для хранения файлов и каталогов в сжатом виде.
- Символьная ссылка — файл, ссылающийся на другой файл, позволяющий (с некоторыми ограничениями) работать с ним как с исходным файлом. В отличие от жёсткой ссылки всё же является самостоятельным файлом, а не альтернативным заголовком одного и того же файла, и потому не привязана к конкретной файловой системе, а значит может ссылаться на файл, находящийся на другом разделе или физическом носителе, в том числе доступный через сеть[21].
- Файлы устройств — не являются настоящими файлами, однако позволяют использовать для ввода-вывода те же API операционной системы, что и для работы с файлами[22]. В CP/M, DOS и Windows таких устройств минимум — это CON (для доступа к клавиатуре и вывода текста в эмулятор терминала), NUL (пустое устройство), а также устаревшие COM1 — COM4 (RS-232) и LPT1 — LPT4 (IEEE 1284)[23]. В unix-подобных ОС через подобные файлы можно получить доступ к большинству аппаратных ресурсов. В них файлы устройств находятся в специальном каталоге (/dev/), и бывают двух типов: символьные (поддерживающие только последовательный ввод-вывод) и блочные[22].
- Именованные каналы предназначены для взаимодействия между процессами, однако используют те же API, что и для работы с файлами. Таким образом, если один процесс производит запись в канал как в файл, другой процесс может прочитать эти данные как из файла[24].
Примечания
- ↑ Таненбаум, 2015, с. 25.
- ↑ 1 2 Таненбаум, 2015, с. 66—67.
- ↑ Online Etymology Dictionary . Дата обращения: 17 августа 2015. Архивировано 24 сентября 2015 года.
- ↑ Bonnier Corporation. Popular Science. — Bonnier Corporation[англ.], 1950. — С. 96—. Архивировано 9 января 2022 года.
- ↑ Robert S. Casey, et al. Punched Cards: Their Applications to Science and Industry, 1952.
- ↑ Martin H. Weik. Ballistic Research Laboratories Report #1115. March 1961. pp. 314—331 Архивная копия от 21 октября 2016 на Wayback Machine
- ↑ Хелмс, 1986, с. 336.
- ↑ Хелмс, 1986, с. 334—335.
- ↑ 1 2 Хелмс, 1986, с. 335.
- ↑ Fernando J. Corbató et al. «An Experimental Time-Sharing System Архивная копия от 6 сентября 2009 на Wayback Machine.» May 3, 1962.
- ↑ Jerome H. Saltzer CTSS Technical Notes Архивная копия от 13 сентября 2006 на Wayback Machine. Project MIT-LCS-TR016
- ↑ Таненбаум, 2015, с. 302.
- ↑ Таненбаум, 2015, с. 306—307.
- ↑ Таненбаум, 2015, с. 305—306.
- ↑ 1 2 Таненбаум, 2015, с. 308—309.
- ↑ Таненбаум, 2015, с. 68.
- ↑ Таненбаум, 2015, с. 311.
- ↑ Таненбаум, 2015, с. 304.
- ↑ Таненбаум, 2015, с. 314—315.
- ↑ Таненбаум, 2015, с. 316—318.
- ↑ Таненбаум, 2015, с. 319.
- ↑ 1 2 Таненбаум, 2015, с. 68—69.
- ↑ Фигурнов В.Э. IBM PC для пользователя. — М.: Инфра-М, 1999. — С. 87—88. — ISBN 5-86225-471-4.
- ↑ Таненбаум, 2015, с. 69.
Литература
- Э. Таненбаум, Х. Бос. Современные операционные системы. = Modern Operating Systems. — 4. — СПб.: Питер, 2015. — (Классика computer science). — ISBN 978-5-496-01395-6.
- Г. Хеллерман и др. Компьютеры. Справочное руководство = The McGraw-Hill Computer Handbook / Г.Хелмс. — М.: Мир, 1986. — Т. 1.