Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы СПО / Мет6.doc
Скачиваний:
34
Добавлен:
12.04.2015
Размер:
406.02 Кб
Скачать

4. Работа с файловой системой

4.1. Создание, открытие, чтение и запись в файл

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

Манипуляторы с номерами 0–4 имеют предопределенный смысл:

0 = STDIN стандартное устройство ввода (по умолчанию клавиатура);

1 = STDOUT стандартное устройство вывода (по умолчанию экран);

2 = STDERR устройство вывода сообщений об ошибках (всегда экран);

3 = AUX последовательных порт (обычно COM1);

4 = PRN параллельный порт (обычно LPT1).

По умолчанию для каждой программы максимальное число одновременно открытых файлов 20. Его можно увеличить функцией 67h.

Изменить максимальное число файловых манипуляторов

Вход: AH = 67h

BX = новое число файловых манипуляторов (20 – 65 535)

Выход: CF = 0 – ошибок нет,

CF = 1 – ошибка, код ошибки в AX (04h – число открытых файлов превышает указанное значение; 08h – не хватает памяти для открытия новой таблицы манипуляторов)

Для создания и открытия файлов (не каталогов) предназначены следующие функции. Полное имя файла в формате ASCIIZ строки передается в DS:DX. Путь может содержать обозначения: «..» – родительский каталог, «.» – текущий каталог. Если диск и путь не указаны, используются их текущие значения.

Создать новый файл DOS

(Если файл с указанным именем существует,

функция возвращает ошибку)

Вход: AH = 5Bh

CX = атрибуты файла

DS:DX = адрес ASCIIZ строки с полным именем файла

Выход: CF=0, если ошибок нет, и AX = файловый манипулятор

CF=1 – ошибка, код в AX (50h – файл уже существует,

03h – путь не найден, 04h – слишком много открытых

файлов, 05h – доступ запрещен)

Создать (заменить) файл DOS

(Если файл с указанным именем существует,

функция присваивает ему нулевую длину)

Вход: AH = 3Ch

CX = атрибуты файла

DS:DX = адрес ASCIIZ строки с полным именем файла

Выход: CF=0, если ошибок нет, и AX = файловый манипулятор

CF=1 – ошибка, код в AX (03h – путь не найден, 04h –

слишком много открытых файлов, 05h – доступ запрещен)

Открыть существующий файл DOS

Вход: AH = 3Dh

DS:DX = адрес ASCIIZ строки с полным именем файла

AL = режим доступа:

биты 2-0: =000 – только для чтения,

=100 – только для чтения, не изменять время последнего обращения к файлу;

=001 – только для записи,

=010 – для чтения и записи.

бит 3: всегда 0

биты 6-4: доступ для других процессов

=000 – режим совместимости (остальные процессы также должны открывать этот файл в режиме совместимости);

=001 – все операции запрещены другим процессам;

=010 – запись запрещена другим процессам;

=011 – чтение запрещено другим процессам;

=100 – ограничений нет.

бит 7: =0 – файл наследуется порождаемыми процессами;

=1 – файл принадлежит только этому процессу

Выход: CF=0, если ошибок нет, и AX = файловый манипулятор

CF=1 – ошибка, код в AX (02h – файл не найден, 03h – путь не найден, 04h – слишком много открытых файлов, 05h – доступ запрещен, 0Ch – неправильный режим доступа)

Функция 5Ah создает временный файл (файл с уникальным именем). Эта функция может применяться как в DOS, так и в Windows.

Создать временный файл

Вход: AH = 5Ah

CX = атрибуты файла

DS:DX = адрес ASCIIZ строки с путем, оканчивающимся символом «\» и следующими за ним тринадцатью нулевыми байтами. На их место записывается имя созданного файла.

Выход: CF=0, если ошибок нет, и AX = файловый манипулятор

CF=1 – ошибка, код в AX (03h – путь не найден,

04h – слишком много открытых файлов,

05h – доступ запрещен)

После закрытия временный файл не уничтожается.

Создать/открыть файл с длинным именем

Вход: AX = 716Ch

DS:SI = адрес ASCIIZ строки с именем файла.

DI = число, которое будет записано в конце алиаса через ~

DX = действие:

бит 4: =1 – если файл не существует, создать и открыть;

=0 – если не существует, возвратить ошибку;

биты 3-0: =0000 – если файл сущ-ет, возвратить ошибку;

=0001 – если файл существует, открыть его;

=0010 – если существует, заменить и открыть.

CX = атрибуты (см. табл.1). Используются, если создается

новый файл

BX = режим доступа:

биты 2-0: =000 – только для чтения,

=100 – только для чтения, не изменять время

последнего обращения к файлу;

=001 – только для записи,

=010 – для чтения и записи.

бит 3: всегда 0

биты 6-4: доступ для других процессов

=000 – режим совместимости (остальные процессы также должны открывать этот файл в режиме совместимости);

=001 – все операции запрещены другим процессам;

=010 – запись запрещена другим процессам;

=011 – чтение запрещено другим процессам;

=100 – ограничений нет.

бит 7: =0 – файл наследуется порождаемыми процессами;

=1 – файл принадлежит только этому процессу

бит 8: =1 – данные не буферизуются, =0 – буферизуются.

бит 9: =1 – если используется сжатие файловой системы программой Doublespace, не архивировать файл.

бит 10: =1 – число в конце короткого имени файла использовать из DI; =0 – вычислять автоматически.

биты 12-11: равны 0

бит 13: =0 – при критических ошибках вызывать int 24h

=1 – при критических ошибках открытия файла и

ввода-вывода не вызывать обработчик int 24h

бит 14: =0 – обычная буферизация при записи на диск

=1 – сбрасывать буфера после каждой записи

Выход: CF = 0, ошибок нет,

AX = файловый манипулятор;

CX = результат операции (0 – открыт существующий файл, 1 – создан новый и открыт, 2 – заменен существующий)

CF=1, если ошибка, в AX код ошибки (02h – файл не найден, 50h – файл уже существует, 03h – путь не найден, 04h – слишком много открытых файлов, 05h – доступ запрещен, 0Сh – неправильный режим доступа)

Функции 3Fh и 40h читают и записывают в файл произвольное число байт. Каждая последующая операция чтения/записи начинается с того байта, на котором остановилась предыдущая операция. Эта позиция запоминается в указателе чтения/записи. При открытии файла указатель устанавливается на первый байт. Переместить указатель на произвольный участок файла позволяет функция 42h.

Чтение из файла (устройства)

Вход: AH = 3Fh

BX = файловый манипулятор

CX = число байт

DS:DX = адрес буфера для приема данных

Выход: CF=0, если ошибок нет, и AX = число прочитанных байт (если при чтении достигнут конец файла, то AX < CX);

CF=1 – ошибка, код ошибки в AX (05h – доступ запрещен, 06h – неверный файловый манипулятор).

Запись в файл (устройство)

Вход: AH = 40h

BX = файловый манипулятор

CX = число байт

DS:DX = адрес буфера с данными

Выход: CF=0, если ошибок нет, и AX = число записанных байт;

CF=1 – ошибка, код ошибки в AX (05h – доступ запрещен, 06h – неверный файловый манипулятор).

Переместить указатель чтения/записи

Вход: AH = 42h

BX = файловый манипулятор

CX:DX = число байт, на которое надо переместить указатель (со знаком)

AL = перемещение от ( 0 – от начала файла,

1 – от текущей позиции, 2 – от конца файла)

Выход: CF = 0, если нет ошибок, и

DX:AX = новое смещение указателя от начала файла

CF = 1 – ошибка, код в AX (06h – неверный манипулятор)

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

Программа может в любой момент принудительно сбросить файловые буферы на диск, вызвав функции 68h или 0Dh.

Сбросить на диск файловые буферы одного файла

Вход: AH = 68h

BX = файловый манипулятор

Выход: CF=0, если ошибок нет,

CF=1 – ошибка, код ошибки в AX

Сбросить на диск файловые буферы всех файлов программы

Вход: AH = 0Dh

Выход:

Закрыть файл

Вход: AH = 3Eh

BX = файловый манипулятор

Выход: CF=0, если ошибок нет;

CF=1 – ошибка, код ошибки в AX (06h – неверный файловый манипулятор)

Функция закрытия фиксирует на диске все изменения, сделанные в файле за сеанс работы. В элементе каталога устанавливается время модификации файла и записывается его новая длина.

Соседние файлы в папке Лабы СПО