11.1 Общие сведения о файловой системе
Обработка файлов - это одна из фундаментальных основ программирования. Владение
техникой программирования обработки файлов является одной из важнейших. Ни одна
сколь, ни будь значимая программа не обходится без работы с файлами.
Понятие файла основано на
использовании внешних запоминающих устройств, первыми из которых стали
магнитные барабаны и ленты. Термин «файл» (в переводе на русский - папка)
означает "поименованная область внешней памяти, хранящая какие либо данные".
Поскольку имена файлов и их атрибуты необходимо где-то хранить, появилось
понятие "каталог". Каталог - это файл, который хранит имена файлов и другие
каталоги. Совокупность программ для работы с файлами и каталогами и физическое
размещение каталогов и файлов называется файловой системой.
Файловая система является частью
операционной системы, и, как правило, является иерархической. Это означает,
что структуру каталогов можно представить в виде некоторого дерева. В целом
файловая система может быть многотомной, т.е. имеется множество разнообразных
устройств ввода /вывода на которых могут храниться файлы. Для указания местоположения файла в
файловой системе используется понятие пути (path - тропинка). В путь
включаются: - логическое имя устройства (drive); - список каталогов - имя файла
- расширение.
Логическое имя устройства (в общем случае) - это любой
идентификатор, обозначающий некоторое устройство. В DOS или Windows для
обозначения логических устройств приняты следующие обозначения: a, b, c, и т.д.
(буквы латинского алфавита). Например буквы a и b обозначают устройство ввода
с дискет (floopy disc). Для указания на то, что это именно устройство, к букве
добавляют двоеточие.
Корневой каталог, или каталог, содержащий все
другие каталоги и файлы, обозначается обратной косой чертой. Все остальные
каталоги должны иметь обязательно имя. Например, для указания некоторого
каталога на данном устройстве необходимо перечислить список каталогов от
корневого до данного.
- Например, можно выделить следующие основные файловые
операции:
-
- открыть файл;
- закрыть файл;
- списать данные из файла;
- записать данные в файл;
- перемещать указатель файла;
- проверить конец файла.
Рассмотрим подробнее каждую операцию. Операция
«Открыть файл» обеспечивает:
- поиск существующего файла или создание нового, в
соответствии с указанным путем;
- проверку прав доступа, например, пользователь может иметь
право только читать файл, поэтому открытие на запись в этом случае не будет
разрешено;
- распределение памяти под буфера ввода/вывода - это
объясняется тем, что физический ввод /вывод осуществляется блоками памяти
фиксированной длины, поэтому вместо реальной передачи в файл производится
запись во внутренний буфер, реальную запись в файл производит специальная
программа операционной системы, называемая драйвером устройства ввода/вывода;
- распределение и заполнение специальной структуры,
называемой блок управления файлом, в которую записываются: атрибуты файла
(размер, время и дата создания, и т.д.), физические адреса файла, указатель
файла и др.
Указатель файла есть специальная переменная блока управления
файлом, значение которой указывает на номер (адрес) байта, начиная с которого
производится операция чтения или записи. После выполнения операции
чтения/записи указатель перемещается на количество байт указанных при
выполнении операции. Например, указатель файла после выполнении операции
«открыть» равен 0, после выполнении операции чтения десяти байт равен 10, если
еще прочитаем 20 байт - станет равным 30. Существует специальная операция
перемещения указателя файла в заданную позицию, при этом существует три
варианта точки отсчета: от начала файла, от конца файла и от текущего значения
указателя.
Операция «Писать данные в файл» обеспечивает передачу
данных из блока памяти программы во внутренний буфер. Реальную запись в файл
осуществляет драйвер, который отслеживает накопление и манипулирование данными.
Запись производится в соответствии с указателем файла. После выполнения
операции указатель файла перемещается вперед на количество записанных байт.
Операция «Читать данные из файла» обеспечивает передачу
данных из файла в блок памяти программы. Реально чтение из файла производится
следующим образом: драйвер определяет, есть ли запрашиваемые данные во внутреннем
буфере, если есть, то передает в блок памяти пользовательской
программы, если данных нет, то читает вычисленный на основании указателя файла
физический блок памяти во внутренний буфер, а затем производит передачу в блок
программы. Чтение производится в соответствии с указателем файла. После
выполнения операции указатель файла перемещается вперед на количество
прочитанных байт.
Операция «Закрыть файл» обеспечивает конечную передачу
данных из внутренних буферов в файл, редактирует атрибуты файла (например,
записывает новый размер файла), освобождает память, занимаемуюбуферами и блок
управления файла.
Тестовые операции предназначены для проверки некоторых
условий для работы с файлом. Например, достигли конца файла, или имеется данный
файл в каталоге и прочее.
Имеется несколько уровней библиотек для работы с файлами.
Самый низкий - это уровень операционной системы, как правило, это
низкоуровневой программный интерфейс, например, программные прерывания DOS, или
функции API Windows и т.д. Интерфейс среднего уровня в Си описывается в
заголовочном файле <IO.H>, ниже будет описано основное множество функций
этого интерфейса. Здесь опишем интерфейс потокового ввода библиотеки
стандартного ввода вывода <STDIO.H>.
|