Иллюстрированный самоучитель по задачам и примерам Assembler

Работа с дисками, каталогами и организация поиска файлов

Ниже приведена структура WIN32_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_05.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;продолжаем поиск – в bх дескриптор, полученный от 714eh:
mov bx.handle
les di.point_find_:формируем указатель на экземпляр структуры WIN32_FIND_DATA
mov ax.714fh:номер функции DOS
хоr si.si:формат даты
int 21h
jnc ml exit: завершить поиск
mov ax.71alh
mov bx.handle
int 21h

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

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

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

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.