
- •Работа с файловой системой
- •Содержание
- •1. Цель работы
- •2. Порядок выполнения работы
- •3. Структура каталогов файловых систем fat и vfat
- •Структура элемента каталога fat в Windows
- •Структура элемента каталога с длинным именем
- •4. Работа с файловой системой
- •4.1. Создание, открытие, чтение и запись в файл
- •4.2. Поиск файлов в dos
- •4.3. Поиск файлов в Windows
- •4.4. Опрос и изменение свойств файлов
- •4.4.1. Атрибуты
- •4.4.2. Дата и время последней модификации
- •4.5. Перемещение и удаление файлов
- •4.6. Работа с каталогами
- •5. Работа с параметрами командной строки
- •6. Пример
- •Текст программы
- •Библиографический список
- •Поиск файлов по дереву каталогов
- •Варианты заданий
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 – неверный файловый манипулятор)
Функция закрытия фиксирует на диске все изменения, сделанные в файле за сеанс работы. В элементе каталога устанавливается время модификации файла и записывается его новая длина.