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

Получение и изменение атрибутов файла

Функция FileTimeToDosDateTime в качестве входного параметра принимает указатель *lpFileTime на экземпляр структуры FILETIME. Этот указатель содержит представление времени в виде 64-битного значения. На выходе данная функция формирует два значения в переменных размером в слово, адреса которых указаны параметрами lpFatDate и lpFatTime. Формат этих слов совпадает с форматом соответствующих параметров, которыми манипулирует функция 71a7h.

Функция DosDateTimeToFileTime, наоборот, преобразует время в формате DOS представленное в виде двух слов wFatDate, wFatTime (для времени и даты соответственно), в 64-битное значение ipFiIeTime.

Установить время создания, последнего доступа или модификации файлов можно с помощью функции SetFileTime.

BOOL SetFileTime(HANDLE hFile .const FILETIME *lpCreationTime.
const FILETIME *lpLastAccessTime, const FILETIME *lpLastWriteTime):

В качестве входных параметров функция SetFileTime принимает указатели на три экземпляра структуры FILETIME и дескриптор файла. Экземпляры структур уже заполнены необходимыми значениями времени. Если какое-либо из значений устанавливать не нужно, то вместо указателя на соответствующую структуру передается NULL. В случае успешного завершения функция возвращает ненулевое значение в регистре ЕАХ.

Из вышеизложенного видно, что для получения различных характеристик файла используются множество различных функций. Работа с ними может утомить кого угодно. Нельзя ли чего-нибудь попроще? Можно. Win32 предоставляет функцию GetFiIelnformationByHandle:

BOOL GetFileInformationByHandle(HANDLE hFile.
LPBY_HANDLE_FILE_INFORMATION lpFilelnformation);

На вход данной функции передается дескриптор файла, о котором необходимо получить Информацию, и указатель на экземпляр структуры BYHANDLEFI LE_ INFORMATION, который заполняется этой функцией. Как видно из названия полей (см. код ниже), в этой структуре сосредоточена вся информация о файле. Ниже приведен пример кода, использующего данную структуру.

;prg07_32.asm – Win32-программа консольного приложения для
;Win32 для исследования работы функции GetFilelnformationByHandle API Win32.
;описание структур
FILETIME struc
DwLowDateTime dd? ;младшие 32 бита значения времени
DwHighDateTime dd? ;старшие 32 бита значения времени
FILETIME ends
BY_HANDLE_FILE_INFORMATION struc
DwFileAttributes dd 0 атрибуты файла
struc
FtCreationTime_DwLowDateTime dd? ;младшие 32 бита
;значения времени создания файла FtCreationTime_
DwHighDateTiirie dd? ;старшие 32 бита значения времени создания файла
ends
struc
FtLastAccessTime_DwLowDateTime dd? ;младшие 32 бита значения времени посл.
;доступа FtLastAccessTime_DwHighDateTime dd? ;старшие 32 бита значения времени посл. доступа
ends
struc
^¦LastWriteTime_DwLowOateTime dd? ;младшие 32 бита значения времени поел, записи
^¦LastWnteTimeJDwHighDateTime dd? ;старшие 32 бита значения времени поел, записи ends
..".-rialNumber dd С ;серийный номер тома, на котором находится файл
| nfTleSizeHigh d
d 0:старшие 32 бита размера файла ¦nFiieSizeLow dd 0
:младшие 32 бита размера файла I nNumberOftinks dd 0;
;число ссылок на файл | nFilelndexHigh dd 0 ;старшие 32 бита идентификатора файла
nFilelndexLow dd 0 ; младшие 32 бита идентификатора файла
ends.data
t info BY_HANDLE_FILE_INFORMATION <> TitleText db 'Получение информации о файле в
Win32',О lpBuf db "p",0 I hFile dd 0.code
¦-------------------------------------CreateFile
;Открываем файл
push О
push 0 – . атрибуты (они игнорируются)
push OPEN_EXISTING:открыть существующий файл, если его нет – ошибка
push 0: защита файла не требуется
push FILE_SHARE_READ разрешено совместное использование файла (по чтению)
push GENERIC_READ разрешено чтение из файла
push offset lpBuf
call CreateFileA
emp eax.Offffffffh
je exit:если неуспех
mov hFile.eax:дескриптор файла №
GetFilelnformationByHandle
push offset info
push hFile
call GetFilelnformationByHandle
emp eax.O
jz exit:выход в случае неудачи ¦"^
;результат смотрим в отладчике TD32.exe

Результат работы данной программы можно посмотреть и проанализировать в отладчике.

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