Файл и файловые системы

Вы когда-нибудь задумывались, что такое файл? Мы всё выяснили.

Время чтения: 7 мин

Кратко

Секция статьи "Кратко"

Файл — это набор сгруппированных данных, которому дали имя и записали на физическом носителе. У файлов есть атрибуты, которые говорят операционной системе, как с ними работать. Для организации сохранённых файлов используются абстрактные модели. Наибольшее распространение получили иерархические модели — деревья директорий (папок) и файлов.

Как это понять

Секция статьи "Как это понять"

Файлы

Секция статьи "Файлы"

Файл — это абстракция, которая пришла из физического мира. До появления компьютеров файлом называли коробку, папку, шнур, пружину и что-то подобное, с помощью которых можно было собрать, упорядочить и хранить несколько листов бумаги вместе.

Файлы в архиве

Файл — это набор данных, сохранённых на носителе информации. В процессе работы программы данные помещаются в оперативную память компьютера и обрабатываются. Все данные в компьютере представляются в виде последовательности машинных слов (байтов). Раньше машинные слова в оперативную память компьютера вводили вручную с помощью специального устройства — телетайпа. Вся последовательность машинных слов находилась в распечатанном или письменном виде на листах бумаги, которые скреплялись с помощью файла. Так и прижилось это понятие.

С появлением магнитных лент для хранения данных стали использовать другую модель — последовательность записей переменной длины. Считать с магнитной ленты данные или записать их на неё можно только последовательно (последовательный доступ). Файлом стали называть часть магнитной ленты с записанными на неё данными. Программисты должны были знать, с какого и по какое место на ленте записаны их данные.

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

Чуть позже были разработаны модели иерархической организации данных в файлах с помощью специальной структуры данных — дерева поиска. Это позволило очень быстро производить поиск по файлу. Такая модель применяется и сейчас, в специализированных системах хранения. Применение иерархической модели стало возможно, благодаря появлению носителей информации с произвольным доступом.

Жёсткие и гибкие диски, flash и SSD накопители реализуют произвольный доступ к данным, что позволяет читать файлы в произвольном порядке. Поэтому разработчики операционных систем снова вернулись к самой первой абстракции — представлению файла в виде последовательности байтов. Однако в этот раз ей назначили имя — имя файла.

Чтобы можно было отделить один файл от другого, в файл записываются атрибуты наряду с данными. Имя файла иногда выносится в отдельную сущность, но чаще записано в атрибутах. Список атрибутов зависит от конкретной операционной системы и файловой системы, которая используется в ней. Вот список наиболее распространённых атрибутов файла:

  • имя;
  • права доступа (определяются согласно правилам операционной системы);
  • персонификация (создатель и владелец);
  • тип файла;
  • размер файла;
  • время создания файла;
  • время последней модификации;
  • время последнего обращения;
  • указатель чтения / записи (часто называют курсором или указателем);
  • и др.

Практически в любой операционной системе работа с файлами осуществляется по похожему сценарию:

  1. Открытие файла (начало сессии);
  2. Работа с содержимым файла и его атрибутами;
  3. Закрытие файла (окончание сессии).

Большинство операционных систем применяют буферизацию, чтобы не заставлять пользователя ждать окончания записи. Она происходит в фоне. При записи новых данных в файл или изменении существующих, операционная система сначала помещает данные в буфер. Если данных много, то они переносятся из буфера в файл постепенно, как во время работы с ним, так и после закрытия файла. В этом случае в интерфейсе пользователя сохранение изменений в файле происходит очень быстро, а для операционной системы существует некоторая инерция. При работе с большими файлами можно заметить как после сохранения и выхода из программы файл ещё некоторое время растёт в размере.

Для работы с файлами в операционной системе предусмотрены специализированные программные интерфейсы. Именно с помощью них программы получают доступ к файлам. Среди интерфейсов можно выделить типовые:

  • open — открытие сессии работы с файлом / создание нового файла;
  • close — закрытие сессии работы с файлом;
  • read / write — читать / писать в файл относительно положения указателя чтения / записи;
  • delete — удалить файл;
  • seek — позиционирование указателя чтения / записи;
  • rename — переименование файла;
  • read_attributes / write_attributes — чтение / модификация атрибутов файла.

В Unix-подобных системах представление внешних устройств сводится к абстракции файла. Работа с устройством происходит через интерфейсы работы с файлами. Это позволяет унифицировать работу программ, облегчает многие задачи для пользователя по обслуживанию приложений и настройке операционной системы.

Файловые системы

Секция статьи "Файловые системы"

Файловая система — абстракция, которая позволяет работать с данными на различных внешних накопителях так, чтобы для программ в операционной системе не видна была разница в аппаратной реализации. Файловая система позволяет на физическом устройстве выделять и освобождать постоянную память, заполнять её данными в асинхронном режиме, используя абстракцию файла. Кроме того, файловая система разрешает конфликты (говорят, коллизии) с именами файлов.

Один из методов решения коллизий — запретить создавать файлы с одинаковыми именами.

Первой моделью организации файлов была одноуровневая (или плоская) файловая система. Использовать такую файловую систему неудобно, если в операционной системе работает несколько пользователей и используется большое количество файлов. Однако одноуровневые файловые системы до сих пор применяются для определённых устройств. Например, в стиральных машинах или в микроволновых печах.

Продолжением одноуровневых файловых систем являются системы с фиксированным количеством уровней. Такие файловые системы используются на маршрутизаторах и телевизорах.

Самой успешной моделью файловой системы является иерархическая модель. Она произвела настоящую революцию в хранении данных. Иерархическая система подразумевает существование дерева данных с узлами трёх типов:

  • корневая директория (каталог, папка) — специальный узел дерева;
  • обычная директория (каталог, папка) — обычные узлы дерева;
  • файлы — листья дерева.
Модель иерархической файловой системы

Такая структура позволяет хранить файлы в разных директориях. Полное имя файла состоит из пути до файла в дереве директорий и имени файла. Таким способом обеспечивается уникальность имён. Файлы с одинаковыми именами не создают коллизии, если хранятся в разных директориях.

Один уровень иерархии от другого отделяется особым символом (например, / для Unix-подобных систем и \ для операционных систем на базе Windows). Поддерживаются и относительные имена файлов, из которых можно сформировать полное имя путём конкатенации (сложения строк) имени директории и относительного имени.

В Unix-подобных системах поддерживаются специальные директории: домашняя директория пользователя и текущая директория. Часть операционных систем вслед за Unix использует эти абстракции. Модель файловой системы Unix считается одной из наиболее удачных и безопасных, поскольку:

  • используется очень простая, но достаточно безопасная система прав доступа;
  • поддерживаются символические ссылки;
  • директории являются специальными файлами;
  • внешние устройства являются специальными файлами;
  • подключение внешних дисков или любых других внешних устройств обеспечивается подключением их к общей файловой системе.

На практике

Секция статьи "На практике"

Игорь Коровченко советует

Секция статьи "Игорь Коровченко советует"

Имена файлов и пути

Секция статьи "Имена файлов и пути"

Путь является неотъемлемой частью имени файла. Абсолютным (полным) именем файла называется путь от корневой директории, относительным — путь от текущей (рабочей) директории. В одной директории не может быть файлов с одинаковым именем.

Относительное имя файла удобно использовать. Можно поместить нужные какой-то программе или проекту файлы в одну директорию, можно использовать структуру поддиректорий для удобства организации и использования дискового пространства. При переносе всей директории на другой носитель или компьютер, проект останется в рабочем состоянии. Относительные пути, как правило, практически не зависят от операционной системы и конкретного компьютера, если вы работаете внутри какой-то директории. Но надо помнить, что относительное имя файла всегда преобразуется в абсолютное при обращении в нему.

В зависимости от операционной системы и файловой системы именование файла обладает рядом особенностей.

Браузер и имена файлов в Интернете

Секция статьи "Браузер и имена файлов в Интернете"

Абсолютное имя может включать в себя ряд параметров:

  • протокол или способ доступа (https, ftp, file и др.);
  • имя или адрес компьютера, узла сети (wikipedia.org, 192.168.0.1, \\MYCOMPUTER, SYS: и др.);
  • устройство хранения, диск (C:, /, SYSLIB и др.);
  • путь к директории (/usr/bin, \TEMP, [USR.LIB.SRC] и др.);
  • собственно имя файла, которое может содержать его расширение (.txt, .exe, .COM и др.).

В строке адреса мы всегда указываем путь к конкретному файлу, ничего более. В Интернете есть части абсолютного имени, которые подставляются по умолчанию. Если вы введёте в строку адреса браузера сайт example.com, браузер скорее всего сначала автоматически подставит протокол по умолчанию https. Окончание абсолютного имени файла в адресной строке браузера зависит от технологии, которая используется для отображения контента страницы. Если страницу полностью формирует сервер (рендеринг на стороне сервера), то при запросе он может вернуть значение, например, index.html для абсолютного пути. В браузере по умолчанию часто не показывается конечный файл, поэтому вы можете и не увидеть, что это index.html. Если рендеринг происходит на стороне клиента (в браузере), то адрес может быть сформирован динамически и не всегда имеет конечный файл. Это происходит из-за специального API браузера — History API. В этом режиме адресная строка используется для отображения виртуального файла. По сути, запуская такое веб-приложение, вы как будто загружаете файл в оперативную память.

Операционная система Windows

Секция статьи "Операционная система Windows"

Абсолютное имя файла включает в себя букву логического диска, после которой обязательно идёт двоеточие и обратная косая черта (back slash) :\. Затем через символ \ перечисляются все поддиректории. В конце указывается имя файла. Чтобы указать путь с пробелами необходимо пользоваться кавычками. Например, скопировать файл можно так:

        
          
          copy "c:\directory\my file name" "d:\another directory\my new file name"
          copy "c:\directory\my file name" "d:\another directory\my new file name"

        
        
          
        
      

В именах каталогов и файлов в Windows сохраняется регистр строк, используемый в момент их создания. Но, например, при поиске файла или копировании регистр не будет иметь значения, поскольку в файловой системе Windows регистр букв по умолчанию не учитывается. Есть способ обойти это ограничение для некоторых версий Windows.

При проектировании работы веб-приложения необходимо учитывать переносимость — ваше приложение в идеале должно работать на большинстве операционных систем. Формировать имя файла нужно очень осторожно: в некоторых операционных системах используются файловые системы, в которых для имён файлов запрещены некоторые символы. Например, для Windows следующие символы запрещены:

  • \ — разделитель подкаталогов;
  • / — разделитель ключей командного интерпретатора;
  • : — отделяет букву диска или имя альтернативного потока данных;
  • * — заменяющий символ (маска «любое количество любых символов»);
  • ? — заменяющий символ (маска «один любой символ»);
  • " — используется для указания путей, содержащих пробелы;
  • < — перенаправление ввода;
  • > — перенаправление вывода;
  • | — обозначает конвейер;
  • + — конкатенация.

В Windows есть ограничение на длину абсолютного имени файла, которая не может больше 260 символов. При этом первые три символа используются для буквы диска и служебного разделителя :\, а последний символ имеет значение <NUL>. Оставшиеся 256 символов используются непосредственно для имени. Начиная с Windows 10, ограничение было снято, но всегда необходимо помнить о пользователях более ранних версий этой операционной системы.

Unix-подобные операционные системы

Секция статьи "Unix-подобные операционные системы"

Абсолютное имя файла в Unix-подобных операционных системах всегда начинается со специального символа корневой директории / (slash), после которого перечисляются через этот же символ все поддиректории. Если путь начинается не с косой черты, то путь становится относительным. Однако существуют специальные последовательности символов, которые позволяют использовать относительные пути эффективно. Например, символ . используется для доступа к текущей директории, а .. к директории, которая стоит на уровень выше. Чтобы перейти на два уровня вверх, можно использовать такую последовательность: ../../. Символ ~ в начале относительного имени будет указывать на домашнюю директорию пользователя, которая обычно расположена в директории /home/username. Например, можно по-разному указать путь для домашней директории пользователя с именем username:

        
          
          # Абсолютный путь/home/username# Относительный путь из папки /tmp../home/username# Если вы работаете от имени пользователя username~# Эквивалент~/../../home/username
          # Абсолютный путь
/home/username

# Относительный путь из папки /tmp
../home/username

# Если вы работаете от имени пользователя username
~

# Эквивалент
~/../../home/username

        
        
          
        
      

В большинстве Unix-подобных операционных систем, имена файлов и директорий зависят от регистра букв. Например, файлы с именами File1 и file1 — это разные файлы. Если необходимо указать пробел в имени файла или директории, можно использовать кавычки или символ \ перед пробелом. Например, следующие пути эквивалентны:

        
          
          '~/super project/script.sh'"~/super project/script.sh"~/super\ project/script.sh
          '~/super project/script.sh'
"~/super project/script.sh"
~/super\ project/script.sh

        
        
          
        
      

В именах файлов UNIX-подобных операционных систем запрещён символ / и символ конца строки \0.

Расширение имени файла

Секция статьи "Расширение имени файла"

Расширение имени файла часто используется для идентификации формата файла. Это нужно в основном для пользователя и простой фильтрации, сортировки или группировки имён файлов. Например, файл image.png является картинкой, movie.avi — видеофайлом, а файл readme.txt — текстовым документом. И мы можем это узнать, не просматривая атрибуты файла. Сам тип файла при этом задаётся в атрибутах файла, расширение имени файла — это лишь инструмент для быстрого (визуального) определения типа файла. Расширение файла помогает не только нам, но и менеджеру запуска приложений. Он может автоматически определить целевую программу, для которой предназначен тот или иной файл.

Есть и специализированные расширения. Например, файлы с расширениями .com и .exe в Windows являются исполняемыми файлами (программами), .ini — описанием конфигурации приложения, .bat — скриптом для терминала (набором команд, выполняемых последовательно), .dll — является динамической библиотекой и содержит функции, которые могут вызывать программы «на лету». В Unix-подобных системах .sh используется для скриптов в терминале, .conf — для конфигурации приложения, а исполняемые файлы (программы), как правило, не имеют расширения.

Структура директорий в Linux

Секция статьи "Структура директорий в Linux"

Во многих Linux-системах можно встретить каталоги /etc, /home, /usr/bin и прочие. В конце января 2004 года был принят стандарт Filesystem Hierarchy Standard (FHS), согласно которому в корневой директории Linux-системы должны находиться поддиректории со стандартными именами. Более того, тип данных (файлов), которые могут находится в той или иной директории регламентирован. Стандарт определяет следующие директории в корневой директории для следующих задач:

Директория Символ
/bin Файлы основных команд (утилит)
/boot Неизменяемые файлы, необходимые для загрузки системы
/dev Файлы устройств
/proc Системные файлы
/sys Подсистема диагностики и управления операционной системы (аналог /proc)
/etc Файлы конфигурации системы на данном компьютере
/home Домашние директории пользователей
/lib Основные разделяемые библиотеки и модули ядра
/lib<alt> Основные разделяемые библиотеки для альтернативных форматов исполняемых файлов
/mnt Точка монтирования для временно подключаемых файловых систем
/root Домашний каталог суперпользователя root
/opt Дополнительные пакеты программного обеспечения
/sbin Основные системные исполняемые файлы
/tmp Временные файлы
/usr Иерархия второго уровня
/var Переменные данные

Если в операционной системе файлы размещены по стандарту, это позволяет предсказать поведение операционной системы. Плюсом является то, что при переходе от одной операционной системы на базе Linux к другой пользователю легко ориентироваться в подобной файловой структуре. Для программиста стандартное расположение файлов позволяет организовать автоматическое взаимодействие между разными компонентами системы.

Однако практически ни один из дистрибутивов Linux не следует стандарту полностью. И сам стандарт продолжает развиваться. Разработчики операционных системы из семейства Unix игнорируют данный стандарт в пользу поддержки собственных.