Организация доступа к файлам

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

Рассмотрим процедуру доступа к последовательным файлам в FAT-системе. Она реализована следующим образом. Область данных диска рассматривается как последовательность пронумерованных кластеров. Каждому кластеру в FAT ставится в соответствие элемент FAT с тем же номером. Например, элемент 100 FAT соответствует 100-му кластеру диска. В каталоге, содержащем сведения о файлах на дисках, для каждого файла указан номер первого кластера, занимаемого файлом. Этот номер называется точкой входа в FAT. Чтобы прочитать данные о файле, система обращается в каталог, находит точку входа соответствующего файла и затем обращается в FAT. Войдя в FAT по точке входа, ОС читает соответствующую ячейку FAT, в которой записан номер следующего занимаемого файлом кластера. Далее ОС снова обращается в FAT, где читает номер следующего кластера, и так происходит до тех пор, пока ячейка не будет содержать специального кода FFF, говорящего системе, что этот кластер – последний кластер файла. Сказанное иллюстрируется в таблице 4.1.

 

Таблица 4.1 – Обработка последовательного файла

Номера элементов FAT Значения элементов FAT Пояснение
100(Точка входа в FAT) следующий кластер файла – № 102
свободный кластер
следующий кластер файла – № 104
FF7 дефектный кластер
следующий кластер файла – № 500
 
следующий кластер файла – № 503
свободный кластер
FF7 дефектный кластер
FFF последний кластер файла
свободный кластер
 

В общем случае конец последовательного файла принято обозначать как EOF (End Of File). Аналогичный идентификатор (EOF) имеет переменная, которой ОС присваивает значение истина или ложь, в зависимости от того, достигнут ли конец файла. Значение этой переменной отслеживает прикладная программа, осуществляющая обработку данного файла.

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

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

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

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

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