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

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

:prg07_26.asm – программа демонстрации применения функции 71A6h
;прерывания 21п:для получения информации о файле по описателю.
BY_HANDLE_FILE_INFORMATION
struc "DwFileAttributes dd? FtCreationTime dd 2 dup(?) FtLastAccessTime dd 2 dup(?)
FtLastWriteTime dd 2 dup(?) DwVolumeSerial Number dd?
NFileSizeHigh dd? NfileSizeLow dd? NnumberOfLinks dd?
NFilelndexHigh dd? NFilelndexLow dd? BY_HANDLE_F1LE_INFORMATION ends
.data
file_info_ BY_HANDLE_FILE_INFORMATION <>
poir,t_find_ dd file_info_
filename db 'my_file with long name.txt'.O
point_fname dd filename
handle dw 0
:………
.code
.файл, о котором будем получать информацию
mov bx.0100h+0400h;не использовать буферизацию
:содержимое 01 в псевдоним
movdx.l открыть файл, если он существует, иначе вернуть ошибку
Ids si.point_fname-.формируем указатель на имя файла
mov di.7 repeat:mov ax.716ch
xor ex.ex
int21h
jnc ml
mov dx.10h
jmp repeat ml: mov handle.ax
;действия при успешном открытии файла:
добавить в конец псевдонима символ 7
; номер функции DOS атрибуты файла – обычный файл – доступ для чтения-записи
;открываем файл
.если файл существовал, то переход
;создать файл
:переход – повторим открытие файла
:сохраним дескриптор файла
;получаем информацию о файле mov bx .handle
stc;это обязательно
Idsdx.point_find_;формируем указатель на структуру BY_HANDLE_FILE_INFORMATION

Создать псевдоним

Функция 71A8h предназначена для генерации короткого (в формате 8.3) имени для заданного файла с длинным именем.

Вход: АН = 71A8h; DS:SI – адрес строки (с нулевым символом в конце), содержащей длинное имя нужного файла без указания пути;

ES:DI – адрес буфера, в котором возвращается псевдоним;

DH – формат псевдонима (0-11 – символьное имя элемента каталога; 1 – имя файла в формате 8.3); DL – набор символов для длинного имени и псевдонима. Это значение – упакованная величина в формате: биты 0..3 – набор символов в родном имени файла (0 – Windows ANSI; I – OEM; 2 – Unicode); биты 4..7 – набор символов в создаваемом коротком имени (0 – Windows ANSI; I – OEM; 2 – Unicode).

Выход: CF = 0 – успешное выполнение функции; CF = 1 – АХ = код ошибки.

:prgO7_27.asm – программа демонстрации применения функции 71A8h
;прерывания 21h;для создания псевдонима.
.'data'"
filenamejong db 'my_file with long name.txt'.0
point_fname_long dd fi1enamejong
filename_short db 11 dup (20h)
point_fname_short dd filename short
handle dw 0
:………
.code
mov bx.0100h+0400h;Не использовать буферизацию + содержимое DI в псевдоним
movdx.l:открыть файл, если он существует, иначе вернуть ошибку
Ids si,point fname_long;формируем указатель на имя файла
movdi.7:добавить в конец псевдонима символ 7 repeat:mov ax,716ch;номер функции DOS
хогсх.сх атрибуты файла – обычный файл – доступ для чтения-записи
int 21h открываем файл
jnc ml:если файл существовал, то переход
movdx.lOh:создать файл
jmp repeat;переход – повторим открытие файла ml:
mov handle.ax:сохранин дескриптор файла создадим псевдоним
Ids si.point_fname_long
les di,point_fname_short
mov dh. 1:prg07_27.asm – программа демонстрации применения функции 71A8h
;прерывания 21h;для создания псевдонима.
mov dl. 0
mov ax,7la8h int 21h действия при успешном открытии файла

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

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