ЛАБОРАТОРНАЯ РАБОТА №4 РАБОТА С ФАЙЛАМИ И

advertisement
ЛАБОРАТОРНАЯ РАБОТА №4
РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ В ОС MS-DOS
1. ЦЕЛЬ РАБОТЫ
Цель данной работы - изучение приемов работы с файлами и каталогами в ОС MS-DOS и функций
DOS, используемых для этого.
2. ОСНОВНЫЕ СВЕДЕНИЯ
2.1. Работа с файлами
Как известно, файловая система MS-DOS представляет собой древовидную совокупность
каталогов, каждый из которых может содержать записи о файлах и о каталогах более низкого уровня.
Запись о файле содержит его имя, расширение имени, длину в байтах, дату и время последнего
изменения, адрес начала файла на диске, а также байт атрибутов.
Смысл разрядов байта атрибутов следующий: бит 0 = 1 - файл
доступен только для чтения; бит 1 = 1 - скрытый файл;
бит 2 = 1 - системный файл;
бит 3 = 1 - данная запись каталога является идентификатором тома;
бит 4 = 1 - данная запись каталога является именем подкаталога;
бит 5 = 1 - архивный файл.
В каждый момент времени один из дисков и один из каталогов на нем считаются текущими. Если
при запросе на поиск файла пользователь не указывает явно каталог, то система прежде всего пытается
найти файл в текущем каталоге.
Чтобы получить доступ к файлу для чтения или записи, пользователь должен открыть файл. Для
этого нужно вызвать соответствующую функцию DOS, указав ей имя файла и, может быть, путь к
каталогу, где расположен файл. Открывая файл, система присваивает ему номер, который пользователь
затем должен указывать при обращении к этому файлу. Для создания нового файла используются другие
функции, также возвращающие номер.
Файл с точки зрения DOS представляет собой совокупность байт, пронумерованных от 0 до
максимального значения. Для каждого открытого файла система помнит положение указателя
чтения/записи. Этот указатель определяет позицию, начиная с которой будет выполняться очередная
операция чтения или записи. Вначале указатель установлен на начальную позицию, при каждой операции
чтения или записи он перемещается вперед по файлу. Пользователь может также переместить указатель в
любую желаемую позицию. Таким образом, DOS дает возможность выполнять как последовательный,
так и прямой доступ к файлам. За одну операцию чтения или записи можно передать любое число байт в
пределах 64K.
После окончания работы с файлом следует закрыть этот файл. Это особенно необходимо, если
содержимое файла изменялось. Если файл не был закрыт, то часть обновленных данных может просто не
записаться на диск, а длина файла может оказаться ошибочной.
Ниже приведены некоторые функции DOS, относящиеся к работе с файлами. Для каждой функции
приведено краткое описание ее действия, список аргументов ( значений, которые программист должен
занести в регистры ), список результатов, которые функция возвращает в регистрах, а также список
возможных ошибок. Признаком ошибки обычно является значение флага CF = 1.
В описаниях многих функциях используется понятие "строка, содержащая путь и имя". Имеется в
виду строка в коде ASCII, содержащая путь к каталогу и завершающаяся спецификацией файла,
например: "C:\DOC\LAB2.TXT". Если задано только имя, то подразумевается текущий каталог.
Признаком конца строки служит код 00h. Вместо пути и имени файла может быть задано имя байтового
устройства, например, "PRN". В этом случае вместо файла используется устройство.
Функция 3ch: Создание файла. Создает и открывает новый файл с указанным именем в текущем
или явно указанном каталоге. Если файл с таким именем ранее существовал, то его длина сбрасывается в
0, т.е. старый файл теряется.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя создаваемого файла.
CX - атрибуты создаваемого файла.
---Результаты ( при CF = 0 ):
AX = номер файла.
---Ошибки ( при CF = 1 ):
AX = 3 - неверный путь;
4 - нет свободного номера файла;
5 - доступ отменен ( либо нет места на диске или в каталоге, либо существует одноименный файл,
доступный только для чтения ).
Функция 5bh: Создание нового файла. Создает и открывает новый файл с указанным именем в
текущем или явно указанном каталоге. Если файл с таким именем уже существует, то новый файл не
создается.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя создаваемого файла.
CX - атрибуты создаваемого файла.
---Результаты ( при CF = 0 ):
AX = номер файла.
---Ошибки ( при CF = 1 ):
AX = 3 - неверный путь;
4 - нет свободного номера файла;
5 - доступ отменен ( либо нет места на диске или в каталоге, либо существует одноименный файл ).
Функция 5ah: Создание временного файла с уникальным именем. Создает и открывает новый файл,
автоматически выбирая ему имя, которое не совпадает ни с одним именем в данном каталоге.
---- Аргументы:
DS:DX - адрес строки, содержащей путь для создания файла. В конце строки после байта 0 должно быть
зарезервировано 13 байт.
CX - атрибуты создаваемого файла.
---- Результаты ( при CF = 0 ):
AX = номер файла.
DS:DX - адрес той же строки, теперь содержащей путь и имя созданного файла.
---- Ошибки ( при CF = 1 ):
AX = 3 - неверный путь;
4 - нет свободного номера файла;
5 - доступ отменен ( нет места на диске или в каталоге ).
Функция 41h: Удаление файла. Если файл имеет атрибут "только чтение", то следует
предварительно отменить этот атрибут с помощью функции 43h.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя удаляемого файла.
---- Ошибки ( при CF = 1 ):
AX = 2 - файл не найден;
5 - доступ отменен ( например, попытка удаления файла, для которого разрешено только чтение ).
Функция 3dh: Открытие файла. Открывает существующий файл для чтения и/или записи.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя открываемого файла.
AL = 0 - файл открывается только для чтения;
1 - файл открывается только для записи;
2 - файл открывается для чтения и записи.
---- Результаты ( при CF = 0 ):
AX = номер файла.
---- Ошибки ( при CF = 1 ):
AX = 2 - файл не найден;
3 - неверный путь;
4 - нет свободного номера файла;
5 - доступ отменен ( например, попытка записи в файл, для которого разрешено только чтение );
12 - неверный код в AL.
Функция 3eh: Закрытие файла.
---- Аргументы:
BX - номер файла.
---- Ошибки ( при CF = 1 ):
AX = 6 - неверный номер файла.
Функция 42h: Перемещение указателя в файле. Поскольку длина файла может превышать 64K, для
задания величины смещения используются 2 регистра. ---- Аргументы:
BX - номер файла.
CX:DX - число байтов, на которые смещается указатель ( CX - старшее слово, DX - младшее слово ).
AL = 0 - смещение отсчитывается от начала файла;
1 - смещение отсчитывается от текущего положения указателя;
2 - смещение отсчитывается от конца файла назад; при этом величина смещения задается как
двойное слово в дополнительном коде.
---- Результаты ( при CF = 0 ):
DX:AX - новое значение указателя.
---- Ошибки ( при CF = 1 ):
AX = 1 - неверный код в AL;
6 - неверный номер файла.
Функция 3fh: Чтение из файла. Выполняется чтение указанного числа байтов, начиная с текущей
позиции указателя. Реальное число прочитанных байтов может оказаться меньше заказанного ( при
достижении конца файла или конца строки на клавиатуре ). Указатель смещается на число прочитанных
байтов.
---- Аргументы:
BX - номер файла.
CX - количество читаемых байтов.
DS:DX - адрес области, куда помещаются прочитанные данные.
---- Результаты ( при CF = 0 ):
AX - количество действительно прочитанных байтов.
---- Ошибки ( при CF = 1 ):
AX = 5 - доступ отменен.
6 - неверный номер файла.
Функция 40h: Запись в файл. Выполняется запись указанного числа байтов, начиная с текущей
позиции указателя. Реальное число записанных байтов может оказаться меньше заказанного при
отсутствии места на диске. Указатель смещается на число записанных байтов.
Есть еще один вариант применения данной функции. Если указывается значение CX = 0 ( запись 0
байтов ), то DOS устанавливает длину файла равной текущему значению указателя ( обрезает конец
файла ).
---- Аргументы:
BX - номер файла.
CX - количество записываемых байтов.
DS:DX - адрес области, откуда берутся данные.
---- Результаты ( при CF = 0 ):
AX - количество действительно записанных байтов.
---- Ошибки ( при CF = 1 ):
AX = 5 - доступ отменен.
6 - неверный номер файла.
2.2. Работа с каталогами
Функция 56h: Переименование или перемещение файла. Файлу с указанным именем присваивается
другое имя. Если при этом изменяется и путь, то файл переносится в другой каталог. Но диск должен
быть одним и тем же.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя файла.
ES:DI - адрес строки, содержащей новые путь и имя файла.
---- Ошибки ( при CF = 1 ):
AX = 2 - один из путей неверен.
5 - старый путь не содержит имени, или новый путь содержит имя существующего файла.
17 - пути относятся к разным устройствам.
Функция 43h: Работа с атрибутами файла. Данная функция либо читает из каталога значение байта
атрибутов файла, либо устанавливает новое значение этого байта.
---- Аргументы:
AL = 0 - прочитать атрибуты;
1 - установить атрибуты.
CX ( при AL=1 ) - новое значение атрибутов.
DS:DX - адрес строки, содержащей путь и имя файла.
---- Результаты ( при CF = 0 ):
CX ( при AL=0 ) - значение атрибутов.
---- Ошибки ( при CF = 1 ):
AX = 1 - неверный код в AL.
3 - путь не найден.
5 - доступ отменен.
Функция 4eh: Поиск первого подходящего файла. Выполняется поиск в каталоге по указанному
пути первого имени файла, соответствующего заданной модели. Под моделью понимается имя файла, в
котором могут содержаться символы "*" ( означающий любое число любых допустимых символов ) и "?"
( один любой допустимый символ ). Если требуется кроме обычных файлов включить в поиск также
скрытые, системные файлы или подкаталоги, то в регистре CX следует установить в 1 соответствующий
бит.
В случае успешного поиска запись о найденном файле помещается в системную область,
называемую DTA. Адрес этой области ( если сам пользователь его не изменял ) равен 80h относительно
значения, которое система при запуске программы загружает в сегментные регистры DS и ES. Структура
записи следующая:
Смещение
Длина
Значение
00h
21
Содержит данные для следующего поиска;
15h
1
Атрибуты файла;
16h
2
Время последнего изменения;
18h
2
Дата последнего изменения;
1ah
2
Младшее слово длины файла;
1ch
2
Старшее слово длины файла;
1eh
13
"Имя.расширение" файла, в конце - код 00h.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и модель имени файла.
CX - значение атрибутов для поиска.
---- Результаты ( при CF = 0 ):
DTA - запись о найденном файле.
---- Ошибки ( при CF = 1 ):
AX = 2 - неверный путь.
18 - подходящий файл не найден.
Функция 4fh: Поиск следующего подходящего файла. Эта функция используется после функции
4eh для поиска следующего файла, имя которого удовлетворяет той же модели. В случае успеха
результаты имеют тот же формат, что для функции 4eh.
---- Аргументы: нет.
---- Результаты ( при CF = 0 ):
DTA - запись о найденном файле.
---- Ошибки ( при CF = 1 ):
AX = 18 - подходящий файл не найден.
Функция 39h: Создание каталога.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя создаваемого каталога.
---- Ошибки ( при CF = 1 ):
AX = 3 - путь не найде .
5 - доступ отменен.
Функция 3ah: Удаление каталога. Удаляемый каталог должен быть пуст. Нельзя удалить текущий
каталог или корневой каталог диска.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя удаляемого каталога.
---- Ошибки ( при CF = 1 ):
AX = 3 - путь не найден.
5 - доступ отменен.
16 - попытка удалить текущий каталог.
Функция 3bh: Смена текущего каталога. Указанный каталог становится текущим.
---- Аргументы:
DS:DX - адрес строки, содержащей путь и имя нового текущего каталога.
---- Ошибки ( при CF = 1 ):
AX = 3 - путь не найден.
Функция 47h: Информация о текущем каталоге. Функция выдает строку, содержащую путь и имя
текущего каталога. Можно получить не только текущий каталог текущего диска, но и тот каталог любого
другого диска, который был текущим, когда этот диск был текущим.
---- Аргументы:
DS:SI - адрес области из 64 байт, куда будет записан путь и имя каталога.
DL - номер диска ( 0 - текущий диск, 1 - диск A, 2 - диск B и т.д. ).
---- Результаты ( при CF = 0 ):
DS:SI - адрес строки, содержащей путь и имя каталога.
---- Ошибки ( при CF = 1 ):
AX = 15 - неверный номер диска.
Функция 0eh: Смена текущего диска. Указанный диск становится текущим. ---- Аргументы:
DL - номер диска ( 0 - диск A, 1 - диск B и т.д. ).
---- Результаты:
AL - число дисковых устройств ( включая логические ) в системе.
Функция 19h: Информация о текущем диске.
---- Аргументы: нет.
---- Результаты:
AL - номер текущего диска ( 0 - диск A, 1 - диск B и т.д. ).
3. ВЫПОЛНЕНИЕ РАБОТЫ
Написать программу на языке ассемблера согласно варианту задания.
Создать с помощью текстового редактора файл с текстом программы.
Оттранслировать программу, добиться отсутствия ошибок трансляции.
Запустить и отладить программу.
4. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ
Даны несколько файлов с именами TEXT1.LAB, TEXT2.LAB, TEXT3.LAB и т.д. Требуется
получить файл SUMTEXT.LAB, составленный из содержимого всех входных файлов в порядке их
размещения в каталоге.
Приведенная ниже программа написана для простого случая, когда все исходные файлы находятся
в текущем каталоге и для всех них длина не превышает 1K байтов.
Текст программы:
stack SEGMENT para stack 'STACK'
db
100h DUP (?)
stack
ENDS
data
SEGMENT para public 'DATA'
namadr
dd ?
; Адрес имени файла из DTA
ihandle
dw ?
; Номер файла для ввода
ohandle
dw ?
; Номер файла для вывода
buffer
db
1000 dup (?) ; Буфер ввода-вывода
ertxt1
db "Не удалось открыть выходной файл",0dh,0ah,"$"
ertxt2
db "Ошибка при поиске первого исходного файла",0dh,0ah,"$"
ertxt3
db
"Не удалось открыть входной файл",0dh,0ah,"$"
ertxt4
db "Ошибка при чтении исходного файла",0dh,0ah,"$"
ertxt5
db "Ошибка при записи в выходной файл",0dh,0ah,"$"
iname
db "TEXT?.LAB",0
oname
db "SUMTEXT.LAB",0
data
ENDS
code
TIME
SEGMENT para public 'CODE'
ASSUME cs:code, ds:data
equ
; Начало работы
0ffffh
; Величина задержки времени
start: mov
mov
ax, data
ds, ax
; Загрузить сегм. адрес данных
; Записать в ОЗУ сегмент:смещение для имени файла из DTA
mov
ax,es
mov
word ptr namadr+2,ax
mov
ax,9eh
; Адрес DTA + смещение имени (80h+1eh)
mov
word ptr namadr,ax
; Открыть выходной файл
lea
dx,oname
; имя выходного файла
mov
cx,0
; обычный файл
mov
ah,3ch
; создать файл
int
21h
jnc
find1
; если нет ошибок
lea
dx,ertxt1
; сообщение об ошибке
jmp
errors
; на обработку ошибок
; Начать поиск исходных файлов по каталогу
find1:
mov
ohandle,ax
; запомнить номер вых.файла
lea
dx,iname
; модель имени входных файлов
mov
cx,0
; поиск обычных файлов
mov
ah,4eh
; поиск первого подходящего
int
21h
jnc
openf
lea
dx,ertxt2
jmp
errors
; Открыть входной файл и переписать все в выходной
openf: push ds
lds
dx,namadr
; адрес найденного имени в ds:dx
mov
ax,3d00h
; открыть только для чтения
int
21h
pop
ds
jnc
readf
lea
dx,ertxt3
jmp
errors
readf: mov
bx,ax
; номер входного файла
mov
ihandle,ax
; сохранить его
mov
cx,0400h
; число байтов - 1K
lea
dx,buffer
; адрес буфера в/в
mov
ah,3fh
; читать из файла
int
21h
jnc
writef
lea
dx,ertxt4
jmp
errors
writef: mov
mov
mov
int
jnc
lea
jmp
cx,ax
; число прочитанных байтов
bx,ohandle
; взять номер выходного файла
ah,40h
; писать в файл
21h
closef
dx,ertxt5
errors
closef: mov
mov
int
bx,ihandle
ah,3eh
21h
; взять номер входного файла
; закрыть входной файл
; Искать следующий файл
nextf: mov
ah,4fh
int
21h
jc
quit
jmp
openf
; Конец работы
quit: mov
mov
int
xor
mov
int
bx,ohandle
ah,3eh
; закрыть выходной файл
21h
al, al
; код завершения 0
ah, 4ch
; выход в DOS
21h
; Обработка ошибок
errors: mov
ah,09h
int
21h
jmp
quit
code
ENDS
END
; выдать текст на экран
start
5. ВАРИАНТЫ ЗАДАНИЙ
Во всех вариантах задания предполагается, что в отдельном каталоге создано несколько текстовых
файлов ( не менее 4 ) с однотипными именами, отличающимися одной цифрой, например, TEXT1.LAB,
TEXT2.LAB, TEXT4.LAB, TEXT4.LAB. Эти файлы следует предварительно создать при помощи
редактора текстов. Желательно создавать их не в порядке номеров, чтобы положение файлов в каталоге
не совпадало с порядком номеров.
5.1. Удвоить текст в каждом файле ( т.е. повторить исходный текст два раза подряд ).
5.2. Создать новый файл, содержащий по 10 последних байтов из каждого исходного файла.
5.3. Перенести все исходные файлы в каталог уровнем выше, а их прежний каталог удалить.
5.4. Разбить каждый файл пополам на 2 файла.
5.5. Найти самый короткий файл и удалить его.
5.6. Слить попарно исходные файлы по порядку номеров: 1 с 2, 3 с 4 и т.д. ( считая, что всего
файлов четное число ).
5.7. Оставить в каждом файле первые 20 байт, остальное удалить.
5.8. Создать отдельные каталоги по числу файлов и перенести каждый файл в свой каталог.
5.9 Оставить в каждом файле последние 10 байт, остальное удалить
5.10 Удалить файлы, содержащие нечетное количество байт
6. ФОРМА ОТЧЕТА
Отчет по лабораторной работе должен включать:
- вариант задания;
- текст программы ( желательно в виде листинга трансляции ).
- распечатки исходных файлов и результатов работы.
7. КОНТРОЛЬНЫЕ ВОПРОСЫ
7.1. Что такое текущий каталог?
7.2. Может ли программа работать с несколькими одновременно открытыми файлами? Как при
этом указывается нужный файл?
7.3. Какие могут быть неприятности, если не закрыть файл, в который выполнялась запись? А если
было только чтение? Оцените в этом плане пример из раздела 4.
7.4. Чем различаются различные функции DOS для создания файла?
7.5. Как перейти в конец файла?
7.6. Почему перемещение файлов в другой каталог выполняется значительно быстрее, чем их
копирование?
7.7. Как найти скрытые файлы?
7.8. В каких случаях нельзя удалить файл? А каталог?
Download