Получить информацию о томе
Вход: АН = 71A0h; DS:DX — адрес ASCIZ-строки с
именем корневого каталога диска, о котором необходимо получить
информацию (С:\); ES:DI — адрес буфера, в который будет помещена
ASCIZ-строка с именем файловой системы; СХ = размер буфера, в который
будет помещена ASCIZ-строка с именем файловой системы.
Выход: CF = 0 — успешное выполнение, при этом в буфер по
адресу в ES-.DI помешается ASCIZ-строка с именем файловой системы и
устанавливаются следующие регистры: ВХ =* флаги файловой системы
(комбинация значений: 0001 — при поиске учитывается регистр букв в
именах файлов; 0002 — файловая система сохраняет регистр букв в
элементах каталога; 0004 — использование символов Unicode в именах
каталогов и файлов; 4000 — файловая система поддерживает длинные имена
файлов и функции для работы с ними; 8000 — том сжат); СХ = максимально
допустимая длина имени файла на данном томе без последнего нулевого
символа (до 255); DX = максимально допустимая длина пути для данного
тома, включая последний нулевой символ (до 260); ;1. _ .,
Создание каталога
Вход: АН = 7139h; DS:DX — адрес строки с
ASCIZ-именем существующего файла. Выход: CF = 0 — при успешном
переименовании; CF = 1 — АХ = код ошибки: 3 — несуществующий путь; 5 —
доступ запрещен.
Удаление каталога
Удаляемый каталог должен быть пуст.
Вход: АН = 713Ah; DS:DX — ASCIZ-строка пути к удаляемому каталогу.
Выход: CF = 0 — АХ = не определен; CF = 1 — АХ = код ошибки: 3 —
несуществующий путь; 5 — доступ запрещен; 10h — попытка удаления
текущего каталога.
Изменить текущий каталог
Понятие текущего каталога аналогично тому,
что приводилось выше при рассмотрении функций для работы с файлами,
имеющими короткие имена.
АН = 713Bh; DS:DX — указатель на буфер, содержащий полный путь от
кор. невого каталога в виде ASCIZ-строки и в качестве последнего
элемента включающий имя нового текущего каталога (естественно, что
допустимы длинные имена с ограничениями по максимальной длине (см.
функцию 71a0h)). Выход: CF = 0 — АХ - не определен; CF=0 — АХ = код
ошибки: 03h — путь не найден
Получение текущего каталога
Вход: АН = 7147h; DL - номер устройства (00h = текущее (заданное по умолчанию), 01h = А: И т. д.); DS:SI — указатель на буфер для записи полного пути от корневого к текущему каталогу (длина буфера должна быть не менее длины, возвращаемой в регистре DX функцией 71a0h). Выход: CF = 0 — успешное выполнение функции, в результате чего полный путь от корневого каталога в виде ASCIZ-строки без имени диска и символа \ записывается в буфер, адрес которого указан в DS:SI; АХ - код ошибки (CF = 1): OFh — недопустимый дисковод. Среди новых функций, работающих в том числе с длинными именами файлов, существует функция 7160h, позволяющая получить полные пути для указанных файлов или относительных путей: получить полный путь (сх = 0), получить полный путь с краткими именами (сх = 1), получить полный путь с длинными именами (сх = 2).
Получить полный путь
Вход: АН = 7160h; CL = 0; СН — содержимое
результата (СН = 80 — получить имя диска; СН = 0 — получить полный
путь); DS:SI — адрес ASCIIZ-строки с именем файла или каталога, для
которых необходимо получить полный путь. Допускаются оба типа имен —
длинные и короткие; ES:DI — адрес строки, в которую необходимо записать
полный путь. Размер буфера должен быть достаточным для размещения пути
максимальной длины (функция 71a0h).
Выход: CF = 0 — успешное выполнение функции, в результате чего
полный путь от корневого каталога в виде ASCIZ-строки записывается в
буфер, адрес которого указан в ES:DI; CF = 1 — АХ = код ошибки.
;prg07_24.asm - программа демонстрации применения функции 7160h (CL=0) прерывания 21h для получения полного пути.
.data
filename db 'my_file with long name.txt'.O
point_fname dd filename
PathFull db 260 dup (0)
point Path dd PalhFull
.code
Ids si .pointfname:формируем указатель на имя файла
les di,point_Path Нормируем указатель на буфер для полного пути
mcvax.7l60h ;номер функции DOS
movch,80h :CH=80h - получить имя : диска; СН=0 - получить полный путь
movCL.O ;получить полный путь
int 21h
jc exit
Данная функция работает очень принмитивно — при указании имени файла или относительного пути (с символами *«.» и «..») она не проверяет его существование, а лишь добавляет к нему имя тсекущего диска и каталога. Поэтому при использовании этой функции требуютсяя другие средства, позволяющие контролировать реальное наличие файла или шути на диске.
Получить полный путь с краткими именами (в формате 8.3)
Вход: АН = 7160h; CL = 1; СН — содержимоое
результата (СН = 80 — получить имя диска; СН = 0 — получить полный
путь); DS:SI — адрес ASCIIZ-строки с именем файла или каталога, для
ксоторых необходимо получить путь в короткой форме. Допускаются оба .
типа имен — длинные и короткие: ES:DI — адрес строки, в которую
необходцимо записать полный путь. Размер буфера должен быть достаточным
длят размещения пути максимальной длины
(функция 71a0h).
Выход: CF = 0 — успешное выполнение функции, в результате
чего полный путь от корневого каталога в виде /ASCIZ-строки
записывается в буфер, адрес которого указан в ES: DI; CF ' = 1 — АХ =
код ошибки.
:prg07_25.asm - программа
демонстрации применения функции 7160h (CL=1) прерывания 21h для
получения полного путии с краткими именами (в формате 8.3)
filename db 'my_file with lorg name.:.txt' .0
point_fname dd filename
PathFUll db 260 аир (О)
pointjath dd PathFull
* Ids si .pointjfname формирует указатель на имя файла
lesdi.point_Path сформируем учазатель на буфер для полного пути
movax.7160h :номер функции DOS
movch.80h ;CH»80h - попучить « имя диска; СН=0 - получить полный путь
movCL.l :получить пспный пууть с краткими именами
На выходе функция формирует стрроку, содержащую полный путь, причем все I Длинные компоненты этого пути замееняются их краткими псевдонимами, удовлетворяющими схеме 8.3. Данный вариант функции (при CL = 1) в отличие от ее Предыдущего варианта, производит прроверку наличия файла или пути.
Получить полный путь с длинными именами
Вход: АН = 7160h; CL = 2; СН — содержимое
результата (СН = 80 — получить имя лиска; СН = 0 — получить полный
путь); DS:SI — адрес ASCIIZ-строки с именем файла или каталога, для
которых необходимо получить путь в длинной форме. Допускаются оба типа
имен — длинные и короткие; ES:DI — адрес строки, в которую необходимо
записать полный путь. Размер буфера должен быть достаточным для
размещения пути максимальной длины (функция 71a0h).
Выход: CF = 0 — успешное выполнение функции, в результате
чего полный путь от корневого каталога в виде ASCIZ-строки записывается в
буфер, адрес которого указан в ES:DI; CF = 1 — АХ = код ошибки.
Получить информацию о файле по описателю
Вход: АН = 71A6h; флаг cf = 1; ВХ = дескриптор файла; DS:DX — адрес структуры
BYHANDLEFILEINFORMATION.
Выход: CF = 0 — успешное выполнение функции; CF = 1 — АХ =
код ошибки. Формат структуры BYHANDLEFILEINFORMATION приведен ниже.
Y_HANDLE_FILE_INFORMATION StuiC
"DwFiieAttributes dd ?
FtCreationTimedd 2 dup(?)
FtLastAccessTime dd 2 dup(?)
FtLastWriteTime dd 2 dup(?)
DwVolumeSeria 1 Number dd ?
NFileSizeHigh dd ?
NfileSizeLow dd ?
NnunberOfLinksdd ?
NFilelndexHighdd ?
NFilelndexLow dd ?
BY_HANDLE_FILE_INFORMATION ends
Поля этой структуры описаны в следующей таблице.
Поле | Описание |
dwFileAttributes | Атрибуты файла. Этот элемент может быть комбинацией следующих значений: FI LE_ATTR IBUTENORMAL (00000000H) - файл доступен по чтению и записи; этот атрибут нельзя комбинировать с другими; FILE_ATTRIBUTE_READONLY (00000001Н) - файл только для чтения; FILE_ATTRIBUTE_HIDDEN (00000002H) - скрытый файл; FILE_ATTRIBUTE_SYSTEM (00000004H) - системный файл; FI LE_ATTR IBUTEDI RECTORY (00000010H) - каталог; FILE ATTRIBUTE ARCHIVE (00000020H) - архивный файл |
CreationTime | Время создания файла в 64-разрядном формате |
ftLastAccessTime | Время последнего доступа к файлу в 64-разрядном формате |
ftLastWriteTime | Время последней записи в файл в 64-разрядном формате |
dwVolumeSeri alNumber | Серийный помер тома, на котором находится файл |
NFileSizeHigh | Старшее слово значения, определяющего размер файла |
NFiieSizeLow | Младшее слово значения, определяющего размер файла |
NNumberOfLinks | Число связей с данным файлом. В файловых системах FAT и HPFS этот элемент всегда равен 1. В файловой системе NTFS число связей может превышать 1 |
NFilelndexHigh | Старшее слово уникального дескриптора, связанного с файлом |
NFilelndexLow | Младшее слово уникального дескриптора, связанного с файлом. Файл однозначно определяется дескриптороми серийным номером тома |
: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 — набор символов в
prpprg0дном имени файла (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'"
fi1enamejong 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;He использовать буферизацию + содержимое 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. В этом несложно убедиться, проанализировав работу приведенной выше программы в отладчике.
Поиск файлов и каталогов
В Windows-версии MS DOS процесс поиска
несколько отличается от рассмотре-ного выше. Для этого используются три
функции и структура WIN32_FIND_DATA в памяти, в которой возвращается
информация о файле. Для запуска процесса поиска вызывается функция 714eh
— найти первый файл.
Вход: АН = 714eh; CL — атрибуты искомых файлов (0000h —
файл доступен по записи и чтению; 0001h — файл доступен по чтению; 0002h
— скрытый файл; 0004И — системный файл; 0008И — метка тома; 00lOh —
каталог; 0020h — архивный файл); СН — дополнительные атрибуты искомых
файлов (0000h — файл доступен по записи и чтению; 0001h — файл доступен
по чтению; 0002h — скрытый файл; 0004h — системный файл; 0008h — метка
тома; 00lOh — каталог; 0020h — архивный файл); DS:DX — адрес
ASCIIZ-строки с именем искомого файла или каталога. Допускаются оба типа
имен — длинные и короткие. В именах допустимы символы шаблона * и ?;
ES-.DI — адрес структуры WI N32_F I ND_DATA, в которой будет возвращена
ин-_ формация о файле; SI — формат, в котором возвращается дата и время
(О — дата и время возвращаются в 64-разрядном формате; 1 — дата и время возвращаются в формате MS DOS).
Выход: CF = 0 — успешное выполнение функции, в результате в
регистрах АХ и СХ возвращается следующая информация: АХ = дескриптор,
использующийся далее для процесса поиска; СХ = возможные значения: 0000 —
все символы структуры WIN32_FIND_DATA, составляющие основное и
альтернативное имя файла, успешно преобразованы из Unicode; 0001 —
основное имя, возвращенное в структуре WIN32_FIND_DATA, содержит знаки
подчеркивания на месте символов, не преобразованных из Unicode; 0002 —
альтернативное имя, возвращенное в структуре WIN32_FIND_DATA, содержит
знаки подчеркивания на месте символов, не преобразованных из Unicode; CF
= 1 — АХ = код ошибки при неудачном выполнении функции. Вызов функции
714eh приводит к заполнению полей структуры WIN32_FIND_ DATA, после чего
можно проанализировать ее поля. Основной интерес представляют поля
основного (CfileName) и альтернативного (CaHernateFiieName) имен. Их
можно анализировать на предмет удовлетворения условиям поиска. Если
необходимо продолжить поиск, вызывается функция 714fh — найти следующий
файл. Если же поиск считается удачным либо его необходимо прекратить, то
вызывается функция 71alh — прекратить поиск. Ниже приведены порядок
вызова функций 714fh и 71alh и формат структуры WIN32_FIND_DATA.
Вход: АН = 714fh; ВХ = дескриптор, полученный функцией
714eh; ES:DI — адрес структуры WIN32FINDDATA, в которой будет возвращена
информация о файле; SI — формат, в котором возвращается дата и время (0
— дата и время возвращаются в 64-разрядном формате; 1 — дата и время
возвращаются в формате MS DOS).
Выход: CF = 0 — успешное выполнение функции, в результате в
регистрах АХ и СХ возвращается следующая информация: СХ = возможные
значения: 0000 — все символы структуры WIN32FINDDATA, составляющие
основное и альтернативное имя файла, успешно преобразованы из Unicode;
0001 — основное имя, возвращенное в структуре WIN32FINDDATA, содержит
знаки подчеркивания на месте символов, не преобразованных из Unicode;
0002 — альтернативное имя, возвращенное в структуре WIN32FINDDATA,
содержит знаки подчеркивания на месте символов, не преобразованных из
Unicode; CF = 1 — АХ = код ошибки при неудачном выполнении функции.
Функция 714eh в отличие от аналогичных функций «старой» MS DOS
использует не область DTA, а некоторый блок в памяти. Этот блок важно
своевременно освобождать, для этого и предназначена функция 71alh.
Вход: АН = 71Alh; ВХ = дескриптор, полученный функцией 714eh.
Выход: CF = 0 — успешное выполнение функции; CF = 1 — АХ = код ошибки
при неудачном выполнении функции.
Ниже приведена структура WI N32_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_O5.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 ;продолжаем поиск - в Ьх дескриптор, полученный от 714eh:
mov bx.handle
les di.point_find_ :формируем указатель на экземпляр структуры WIN32_FIND_DATA
mov ax.714fh :номер функции DOS
хог si.si :формат даты
int 21h
jnc ml exit: завершить поиск
mov ax.71alh
mov bx.handle
int 21h
В отладчике хорошо видно, что выход из данной программы происходит в двух случаях:
- когда файл найден, выход из программы производится в результате сравнения командой empsb (флаг ZF устанавливается в 1);
- когда файлов, удовлетворяющих шаблону, нет, функция поиска 714еп и 714fh завершается неудачей (флаг CF устанавливается в 1).
В качестве шаблона можно задать символы *.*, тогда мы сможем
получить имена и проанализировать все файлы в текущем каталоге. Это
может понадобиться при программировании операции перемещения или
копирования каталога.
Остальные функции работы с файлами, предназначенные для записи/чтения/позиционирования, остались прежними.