Компонентами модели файловой системы являются:
— файл fs – модель дискового пространства, объемом 32 Кбайт, размер блока – 256 байт (128 блоков).
— таблица размещения файлов и каталог (файл “file.map”);
— таблица открытых фалов OpenFileTable;
— векторная карта свободного пространства в модели файловой системы.
Во всех вариантах задания предполагается, что в файловой системе существует только корневой каталог. Каждая запись каталога содержит, как минимум, следующую информацию:
— дескриптор файла в файловой системе – целое неотрицательное число;
— имя файла (до 64 символов);
— тип файла (до 3 символов);
— байт атрибутов (только чтение, только запись);
— длина файла;
— дата и время создания;
— номер первого блока (список блоков).
Файл не может иметь длину более 10 блоков. Файловая система не позволяет создать двух файлов с одинаковым именем.
Таблица открытых файлов должна содержать следующую информацию:
— номер элемента таблицы (FileHandle);
— дескриптор файла;
— номер блока чтения;
— номер блока записи;
— режим открытия («r» — чтение, «w» — запись)
Функции API для управления файловой системой:
void MKfs; Выполняет инициализацию файловой системы, т.е. создает файл fs, очищает каталог и список открытых фалов;
int MCreateFile(String FName); Создает файл с заданным именем. Функция возвращает –1, если файл не может быть создан или номер записи в таблице открытых файлов. По умолчанию, создаваемый файл открывается для записи;
int MDeleteFile(String FName) : boolean; Удаляет файл с заданным именем. Функция возвращает -1 если файл не существует и 0, если все в порядке;
int MOpenFile(String Fname, String mode); Открывает файл с заданным именем. Функция возвращает –1(если файл не найден или доступ данного вида к нему запрещен) или номер записи в таблице открытых файлов. Режим открытия mode=r, если файл открывается для чтения, w — для записи.
Далее во всех функциях в качестве идентификатора файла будет использоваться его номер в таблице открытых файлов.
int MCloseFile(int Hnadle); Закрывает файл.
int MEOF(int Handle) : Boolean; Возвращает не 0, если указатель на текущую запись показывает на конец файла.
procedure MRead(int Handle; intr Buf[]) ; Чтение блока из файла.
procedure MWrite(int Handle; int Buf[]); Запись блока в файл..
Операции чтения/записи в модели файловой системы осуществляются только поблочно. Состояние файловой системы: корневой каталог, таблицы расположения моделей файлов сохраняются в “file.map”. В таблице размещения файлов для вариантов «связанный список индексов», «связанный список блоков» предлагаются следующие служебные занчения:
— FF – конец файла;
— FE – пустой блок.
Способ физической организации файла и дополнительные функции определяются вариантом задания. Примерный вариант организации интерфейса пользователя представлен на рисунке 1.16.
Рассмотрим пример функционирования файловой системы на примере связанного списка индексов (аналог FAT). После инициализации список файлов пустой, таблица открытых файлов пустая. Создаем файл: MCreateFile(“1.dat”). Ищем свободное место (блок 0 — свободен). Создаем запись в корневом каталоге: [0 – дескриптор файла, «1.dat» — имя, 0 — адрес первого блока]. Записываем в элемент 0 таблицы размещения файлов значение FF (признак конца файла). Состояние таблицы размещения показано на рисунке 1.12.
Таблица размещения:
№ кл. | … | |||||||||||||
Зн. | FF | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE |
Корневой каталог:
Дескриптор | Имя | № первого блока |
1.dat |
Таблица открытых файлов:
Handle | Дескриптор | Имя | Размер | № блока чтения | № блока записи |
1.dat |
Рисунок 1.12 – Состояние файловой системы после создания файла
Выполняем операцию MOpenFile(“0.dat”,”r”). Результат = -1 (файл не найден). Выполняем операцию MOpenFile(“1.dat”,”w”). В таблице открытых файлов создается запись [0 – дескриптор файла, 0 – номер блока для чтения, 0 – номер блока для записи, “w” — файл открыт для записи]. Результат функции равен 0 – индекс в таблице открытых фалов. Выполняем операцию записи MWrite(0, buf). Корректируем таблицу открытых файлов: [0 – дескриптор файла, 0 – номер блока для чтения, 1 – номер блока для записи, “w” — файл открыт для записи]. Корректировать состояние файловой системы не нужно, так как количество свободных/занятых блоков не изменилось. Повторяем операцию записи MWrite(0, buf). Корректируем состояние файловой системы: ищем свободный блок в карте свободного места – это блок 1, записываем в таблицу расположения файлов в элемент 0 значение 1 (указатель на следующий блок файла), в элемент 1 – значение FF (рисунок 1.13).
Таблица размещения:
№ кл. | … | |||||||||||||
Зн. | FF | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE |
Корневой каталог:
Дескриптор | Имя | № первого блока |
1.dat |
Таблица открытых файлов:
Handle | Дескриптор | Размер | № блока чтения | № блока записи |
Рисунок 1.13 – Состояние файловой системы после двух операций записи
Создаем файл: MCreateFile(“2.dat”). Также записываем в него два блока (Рисунок 1.14)
Таблица размещения:
№ кл. | … | |||||||||||||
Зн. | FF | FF | FE | FE | FE | FE | FE | FE | FE | FE | FE | FE |
Корневой каталог:
Дескриптор | Имя | № первого блока |
1.dat | ||
2.dat |
Таблица открытых файлов:
Handle | Дескриптор | Размер | № блока чтения | № блока записи |
Рисунок 1.14 – Состояние файловой системы после создания и записи в файл 2.dat
Снова выполняем операцию записи в файл 1.dat: MWrite(0, buf). Изменения в файловой системе представлены на рисунке 1.15
Таблица размещения:
№ кл. | … | |||||||||||||
Зн. | FF | FF | FE | FE | FE | FE | FE | FE | FE | FE | FE |
Корневой каталог:
Дескриптор | Имя | № первого блока |
1.dat | ||
2.dat |
Таблица открытых файлов:
Handle | Дескриптор | Размер | № блока чтения | № блока записи |
Рисунок 1.15 – Состояние файловой системы после создания и записи в файл 2.dat
Интерфейс пользователя.Интерфейсная часть должна обеспечивать возможность вызывать функции управления файловой системы, просматривать корневой каталог и таблицы размещения файлов. Команды интерфейса должны давать возможность не только вызвать функции подсистемы управления файлами, но и выводить список файлов (dir) и таблицу открытых файлов (openfiles). Примерный интерфейс представлен на рисунке 1.16
Рисунок 1.16 – Модель файловой системы
Статьи к прочтению:
ЧТО ТАКОЕ ФУНКЦИЯ? КАК СТРОИТЬ ГРАФИК ФУНКЦИИ. ЕГЭ с Артуром Шарифовым
Похожие статьи:
-
Рекомендации по реализации функций подсистемы управления памятью
Компонентами модели виртуальной памяти являются: — модель оперативной памяти (массив объемом 4096 байт); — модель файла-подкачки (файл с именем swap.dat…
-
Реализация функций api с помощью внешних библиотек
При реализации функций API с помощью внешних библиотек они предоставляются пользователю в виде библиотеки процедур и функций, созданной сторонним…