Работа с дисками, каталогами и организация поиска файлов
Ниже приведена структура 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).
В качестве шаблона можно задать символы *.*, тогда мы сможем получить имена и проанализировать все файлы в текущем каталоге. Это может понадобиться при программировании операции перемещения или копирования каталога.
Остальные функции работы с файлами, предназначенные для записи/чтения/позиционирования, остались прежними.