Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать
      1. Поиск файлов

Поиск группы файлов, имена которых удовлетворяют определенному шаблону, выполняется в два этапа, в случае поиска файлов с короткими именами, и в три — в случае поиска файлов с длинными именами.

На первом этапе используется функция "Найти первый файл", при этом указывается шаблон, который может содержать путь к обрабатываемому каталогу и шаблонные символы "*" (последовательность допустимых символов произвольной длины) и "?" (любой допустимый символ в данной позиции). Как и ранее, если путь не указан, подразумевается текущий каталог.

Функция DOS 4Eh — Найти первый файл (с коротким именем)

Ввод: АН = 4Eh

AL используется при обращении к функции APPEND

СХ = атрибуты, которые должен иметь файл (биты 0 (только для чтения) и 5 (архивный бит) игнорируются, если бит 3 (метка тома) установлен, все остальные биты игнорируются)

DS:DX = адрес ASCIZ-строки с именем файла, которое может включать путь и шаблонные символы для поиска (символы «*» и «?»)

Вывод: CF = 0 и область DTA заполняется данными, если файл найден; иначе:

CF = 1 и АХ = код ошибки (02h, 03h или 12h (0Сh?))

Если файл не найден, устанавливается флаг CF, а в АХ возвращается код 2, иначе информация о найденном файле записывается в область передачи данных (DTA).

Наряду со служебной информацией, обеспечивающей возможность поиска очередного файла, в DTA записываются сведения об атрибутах, дате и времени модификации, размере найденного файла, а также имя файла (без пути) в формате ASCIIZ. Если длина имени с расширением составляет менее 12 байт, остаток поля заполняется нулями.

По умолчанию область DTA располагается в префиксе программного сегмента (PSP) выполняющейся программы по смещению 80h. Так как при запуске EXE-программы операционная система помещает адрес PSP в сегментные регистры DS и ES, доступ к области DTA удобно производить с помощью регистра ES (DS обычно используется для обращения к сегменту данных). Таким образом, запись ES:[0] укажет на первый байт PSP, а ES:[80h] — на первый байт DTA.

Область DTA может быть переопределена с помощью функции DOS lAh.

Функция DOS 1Ah Установить область DTA

Ввод: АН = 1Ah

DS:DX = адрес начала DTA (128-байтный буфер)

Функции поиска файлов заполняют DTA следующим образом:

+00h: байт — биты 0-6: ASCII-код буквы диска; бит 7: диск сетевой

+01h: 11 байт — маска поиска (без пути)

+0Ch: байт — атрибуты для поиска

+0Dh: слово — порядковый номер файла в директории

+0Fh: слово — номер кластера начала внешней директории

+11h: 4 байта — зарезервировано

+15h: байт — атрибут найденного файла

+16h: слово — время создания файла в формате DOS:

биты 15-11: час (0 - 23)

биты 10-5: минута

биты 4-0: номер секунды, деленный на 2 (0 - 30)

+18h: слово — дата создания файла в формате DOS:

биты 15-9: год, начиная с 1980

биты 8-5: месяц

биты 4-0: день

+1Ah: 4 байта — размер файла

+1Eh: 13 байт — ASCIZ-имя найденного файла с расширением

На втором этапе поиска вызывается функция "Найти следующий файл", которая использует информацию из DTA после предыдущего поиска. Эта функция при каждом новом вызове находит следующий файл, удовлетворяющий первоначальному шаблону. Файлы находятся в порядке их следования в записи каталога. Подкаталоги не обрабатываются. Для поиска всех файлов, удовлетворяющих указанному ранее шаблону, следует вызывать функцию 4Fh, пока не будет возвращена ошибка с кодом 2 (в неответственных случаях код ошибки можно не проверять).

Функция DOS 4Fh Найти следующий файл

Ввод: АН = 4Fh

DTA — содержит данные от предыдущего вызова функции 4Еh или 4Fh

Вывод: CF = 0 и DTA содержит данные о следующем найденном файле, если не произошла ошибка; иначе:

CF = 1 и АХ = код ошибки

Для случая длинных имен файлов (LFN) употребляется набор из трех подфункций функции DOS 71h, которые можно использовать, только если активна подсистема IFSmgr Windows (всегда активна при нормальной работе Windows). Это функции "Найти первый файл", "Найти следующий файл" и "Закончить поиск файла". Последняя функция используется для освобождения системных ресурсов Windows, которые были заняты в результате выполнения поиска.

Функция LFN 4Eh Найти первый файл с длинным именем

Ввод: АХ = 714Eh

CL = атрибуты, которые файл может иметь (биты 0 и 5 игнори­руются)

СН — атрибуты, которые файл должен иметь

SI = 0: использовать Windows-формат даты/времени

SI = 1: использовать DOS-формат даты/времени

DS:DX = адрес ASCIZ-строки с шаблоном для поиска (может вклю­чать «*» и «?»)

ES:DI = адрес 318-байтного буфера для информации о файле

Вывод: CF = 0

АХ = поисковый идентификатор

СХ = Unicode-флаг

бит 0: длинное имя содержит подчеркивания вместо непреобразуемых Unicode-символов

бит 1: короткое имя содержит подчеркивания вместо непреобразуемых Unicode-символов

CF = 1, АХ = код ошибки, если произошла ошибка (7100h -функция не поддерживается)

Длинные имена файлов, в отличие от коротких имен, не обязаны включать в себя точку, разделяющую имя и расширение файла. Поэтому для совместимости с функцией 4Fh данная функция при указании шаблона «*.*» ищет все файлы в каталоге, а не только файлы с точкой в имени. Если файл, удовлетворяющий указанному шаблону и атрибутам поиска, найден, об­ласть данных по адресу ES:DI заполняется следующим образом:

+00h: 4 байта — атрибуты файла

биты 0-6: атрибуты файла DOS

бит 8: временный файл

+04h: 8 байт — время создания файла

+0Ch: 8 байт — время последнего доступа к файлу

+14h: 8 байт — время последней модификации файла

+lCh: 4 байта — старшее двойное слово длины файла

+20h: 4 байта — младшее двойное слово длины файла

+24h: 8 байт — зарезервировано

+2Сh: 260 байт — ASCIZ-имя файла длинное

+130h: 14 байт — ASCIZ-имя файла короткое

Причем даты создания/доступа/модификации записываются в од­ном из двух форматов, в соответствии со значением SI при вызове фун­кции. Windows-формат — 64-битное число 100-наносекундных интерва­лов с 1 января 1601 года, а если используется DOS-формат — в старшее двойное слово записывается DOS-дата, а в младшее — DOS-время (см. описание струтуры данных, возвращаемых функциями 4Еh и 4Fh).

Функция LFN 4Fh Найти следующий файл

Ввод: АХ = 714Fh

ВХ = поисковый идентификатор (от функции 4Eh)

SI = формат даты/времени

ES:DI = адрес буфера для информации о файле

Вывод: CF = 0 и СХ = Unicode-флаг, если следующий файл найден

CF = 1, AX = код ошибки, если произошла ошибка (7100h — функция не поддерживается)

Функция LFN A1h Закончить поиск файла

Ввод: AX = 71Alh

ВХ = поисковый идентификатор

Вывод: CF = 0, если операция выполнена

CF = 1 и АХ = код ошибки, если произошла ошибка (7100h — функция не поддерживается)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]