Сборник по задачам и примерам Assembler

     

Поиск файлов и каталогов



Поиск файлов и каталогов

В Windows-версии MS DOS процесс поиска несколько отличается от рассмотре-ного выше. Для этого используются три функции и структура WIN32_FIND_DATA в памяти, в которой возвращается информация о файле. Для запуска процесса поиска вызывается функция 714eh — найти первый файл.

Вход: АН = 714eh; CL — атрибуты искомых файлов (0000h — файл доступен по записи и чтению; 0001h — файл доступен по чтению; 0002h — скрытый файл; 0004И — системный файл; 0008И — метка тома; 00lOh — каталог; 0020h — архивный файл); СН — дополнительные атрибуты искомых файлов (0000h — файл доступен по записи и чтению; 0001h — файл доступен по чтению; 0002h — скрытый файл; 0004h — системный файл; 0008h — метка тома; 00lOh — каталог; 0020h — архивный файл); DS:DX — адрес ASCIIZ-строки с именем искомого файла или каталога. Допускаются оба типа имен — длинные и короткие. В именах допустимы символы шаблона * и ?; ES-.DI — адрес структуры WI N32_F I ND_DATA, в которой будет возвращена ин-_ формация о файле; SI — формат, в котором возвращается дата и время

(О — дата и время возвращаются в 64-разрядном формате; 1 — дата и время возвращаются в формате MS DOS).

Выход: CF = 0 — успешное выполнение функции, в результате в регистрах АХ и СХ возвращается следующая информация: АХ = дескриптор, использующийся далее для процесса поиска; СХ = возможные значения: 0000 — все символы структуры WIN32_FIND_DATA, составляющие основное и альтернативное имя файла, успешно преобразованы из Unicode; 0001 — основное имя, возвращенное в структуре WIN32_FIND_DATA, содержит знаки подчеркивания на месте символов, не преобразованных из Unicode; 0002 — альтернативное имя, возвращенное в структуре WIN32_FIND_DATA, содержит знаки подчеркивания на месте символов, не преобразованных из Unicode; CF = 1 — АХ = код ошибки при неудачном выполнении функции. Вызов функции 714eh приводит к заполнению полей структуры WIN32_FIND_ DATA, после чего можно проанализировать ее поля. Основной интерес представляют поля основного (CfileName) и альтернативного (CaHernateFiieName) имен. Их можно анализировать на предмет удовлетворения условиям поиска. Если необходимо продолжить поиск, вызывается функция 714fh — найти следующий файл. Если же поиск считается удачным либо его необходимо прекратить, то вызывается функция 71alh — прекратить поиск. Ниже приведены порядок вызова функций 714fh и 71alh и формат структуры WIN32_FIND_DATA.


Вход: АН = 714fh; ВХ = дескриптор, полученный функцией 714eh; ES:DI — адрес структуры WIN32FINDDATA, в которой будет возвращена информация о файле; SI — формат, в котором возвращается дата и время (0 — дата и время возвращаются в 64-разрядном формате; 1 — дата и время возвращаются в формате MS DOS).

Выход: CF = 0 — успешное выполнение функции, в результате в регистрах АХ и СХ возвращается следующая информация: СХ = возможные значения: 0000 — все символы структуры WIN32FINDDATA, составляющие основное и альтернативное имя файла, успешно преобразованы из Unicode; 0001 — основное имя, возвращенное в структуре WIN32FINDDATA, содержит знаки подчеркивания на месте символов, не преобразованных из Unicode; 0002 — альтернативное имя, возвращенное в структуре WIN32FINDDATA, содержит знаки подчеркивания на месте символов, не преобразованных из Unicode; CF = 1 — АХ = код ошибки при неудачном выполнении функции. Функция 714eh в отличие от аналогичных функций «старой» MS DOS использует не область DTA, а некоторый блок в памяти. Этот блок важно своевременно освобождать, для этого и предназначена функция 71alh.

Вход: АН = 71Alh; ВХ = дескриптор, полученный функцией 714eh. Выход: CF = 0 — успешное выполнение функции; CF = 1 — АХ = код ошибки при неудачном выполнении функции.

Ниже приведена структура WI N32_FIND_DATA, в которую в процессе поиска записывается информация о файлах.

WIN32_FIND_DATA struc

DwFlleAttributes dd ?

FtCreationTime dd 2 dup(?)



FtLastAccessTime dd 2 dup(?)

FtLastWriteTime dd 2 dup(?)

NFileSizeHigh dd ? .размер файла в байтах (старшее слово)

NFiieSizeLow dd ? ;размер файла в байтах (младшее слово)

DwReservedO dd 0 ;резерв

OwReservedl dd 0 ;резерв

CFileName db MAX_PATH dup(?)

CAlternateFileName db 14 dup(?) WIN32_FIND_DATA ends

Поля этой структуры описаны в следующей таблице.

dwFileAttributes

Атрибуты найденного файла (см. описание аналогичного элемента структуры BY HANDLE FILE INFORMATION)

ftCreationTime

Время создания файла в одном из двух форматов: MS DOS или в 64-разрядном, в зависимости от параметров, указанных при вызове функций 714eh (найти первый файл) и 714fh (найти следующий файл)

ftLastAccessTime

Время последнего доступа к файлу в одном из двух форматов: MS DOS или в 64-разрядном, в зависимости от параметров, указанных при вызове функций 714eh и 714fh

fUastWrUeTime

MS DOS или в 64-разрядном, в зависимости от параметров, указанных при вызове функций 714eh и 714fh

CFileName

ASCIIZ-строка, содержащая имя файла. Размер строки должен быть не менее 256 символов

cAlternateFileName

ASCIIZ-строка, содержащая альтернативное имя файла в стандартном формате 8.3. Если элемент cFileName содержит имя в формате 8.3 или файловая система не поддерживает альтернативные имена в формате 8.3, то элемент cAlternateFileName равен нулю

<


Приведем пример поиска файла по шаблону. Для этого предварительно создадим несколько файлов в соответствии с шаблоном file*.*. Среди этих файлов должен быть файл file_O5.txt. В отладчике проследим за тем, как изменяется

содержимое области памяти, отведенное для экземпляра структуры WIN32_FIND_ DATA. Выход из программы — при обнаружении файла file_5.txt

:prgO7_28.asm - программа демонстрации поиска файла по шаблону.

WIN32_FIND_DATA -uc

DwFlleAttributes dd ?

FtCreationTime dd 2 dup(?)

FtLastAccessTime dd 2 dup(?)

FtLastWriteTime dd 2 dup(?)

NFileSizeHigh dd ? .размер файла в байтах (старшее слово)

NFileSizeLow dd ? .размер файла в байтах (младшее слово)

DwReservedO dd 0 ;резерв

DwReservedl dd 0 :резерв

CFileName db 260 dup(?)

CAlternateFileName db 14 dup(?)

WIN32_FIND_DATA ends

.data

find_ WIN32_FIND_DATA <>

point_find_ dd find_

f_name_pattern db 'file_*.*'.O

point_f_name_pattern dd f_name_pattern

filename db 'file_05.txt',0 :искомый файл

1e*n_fi1ename=$-fi1ename

handle dw 0

movCL.O ;атрибуты искомого файла

movch.O ;дополнителные атрибуты для поиска

Ids dx,point_f_name_pattern ;формируем указатель на строку с шаблоном

les di.point_find_;формируем указатель на экземпляр структуры WIN32_FIND_DATA

movax.714eh :номер функции DOS

int 21h

jc exit

;в ах был возвращен дескриптор - если нужно, то его необходимо сохранить:

mov handle.ax

:проверяем, тот ли это файл: ml: mov ex.1en_fi1ename

lea di.find_.CfileName

lea si .filename repe empsb

jz exit ;продолжаем поиск - в Ьх дескриптор, полученный от 714eh:

mov bx.handle

les di.point_find_ :формируем указатель на экземпляр структуры WIN32_FIND_DATA

mov ax.714fh :номер функции DOS

хог si.si :формат даты

int 21h

jnc ml exit: завершить поиск

mov ax.71alh

mov bx.handle

int 21h

В отладчике хорошо видно, что выход из данной программы происходит в двух случаях:

  • когда файл найден, выход из программы производится в результате сравнения командой empsb (флаг ZF устанавливается в 1);


  • когда файлов, удовлетворяющих шаблону, нет, функция поиска 714еп и 714fh завершается неудачей (флаг CF устанавливается в 1).


  • В качестве шаблона можно задать символы *.*, тогда мы сможем получить имена и проанализировать все файлы в текущем каталоге. Это может понадобиться при программировании операции перемещения или копирования каталога.

    Остальные функции работы с файлами, предназначенные для записи/чтения/позиционирования, остались прежними.

     

    Содержание раздела