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