Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Макушкиной по МОЯ.doc
Скачиваний:
46
Добавлен:
16.11.2019
Размер:
1.33 Mб
Скачать

7.10.2 Найти следующий файл

Функция DOS 4Fh — Найти следующий файл

Ввод:

АН = 4Fh DTA — содержит данные от предыдущего вызова функции 4Е или 4F

Вывод:

CF = 0 и DTA содержит данные о следующем найденном файле, если не произошла ошибка CF = 1 и АХ = код ошибки, если произошла ошибка

Для случая длинных имен файлов (LFN) употребляется набор из трех подфункций функции DOS 71h, которые можно использовать, только если запущен IFSmgr (всегда запускается при обычной установке Windows 95, но не запускается, например, с загрузочной дискеты MS-DOS 7.0).

В качестве примера программы, использующей многие из функций работы с файлами, рассмотрим программу, заменяющую русские буквы «Н» на латинские «Н» во всех файлах с расширением .ТХТ в текущем каталоге.

; fidoh.asm

; заменяет русские "Н" на латинские "Н" во всех файлах с расширением .ТХТ

; в текущем каталоге

.model tiny

.code

org 100h ; СОМ-файл

start:

mov ah,4Eh ; поиск первого файла

xor cx,cx ; не системный, не каталог и т.д.

mov dx,offset filespec ; маска для поиска в DS:DX

file_open:

int 21h

jc no_more_files ; если CF = 1 - файлы кончились

mov ax,3D02h ; открыть файл для чтения и записи

mov dx,80h+1Eh ; смещение DTA + смещение имени файла

int 21h ; от начала DTA

jc find_next ; если файл не открылся - перейти

; к следующему

mov bx,ax ; идентификатор файла в ВХ

mov cx,1 ; считывать один байт

mov dx,offset buffer ; начало буфера - в DX

read_next:

mov ah,3Fh ; чтение файла

int 21h

jc find_next ; если ошибка - перейти к следующему

dec ах ; если АХ = 0 - файл кончился -

js find_next ; перейти к следующему

cmp byte ptr buffer,8Dh ; если не считана русская "Н",

jne read_next ; считать следующий байт,

mov byte ptr buffer,48h ; иначе - записать в буфер

; латинскую букву "Н"

mov ax,4201h ; переместить указатель файла от текущей

dec cx ; позиции назад на 1

dec cx ; CX = FFFFh

mov dx,cx ; DX = FFFFh

int 21h

mov ah,40h ; записать в файл

inc cx

inc cx ; один байт (СХ = 1)

mov dx,offset buffer ; из буфера в DS:DX

int 21h

jmp short read_next ; считать следующий байт

find_next:

mov ah,3Eh ; закрыть предыдущий файл

int 21h

mov ah,4Fh ; найти следующий файл

mov dx,80h ; смещение DTA от начала PSP

jmp short file_open

no_more_files: ; если файлы кончились,

ret ; выйти из программы

filespec db "*.txt",0 ; маска для поиска

buffer label byte ; буфер для чтения/записи -

end start ; за концом программы