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

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

Поиск файлов с помощью функций FindFirstFile и FindNExtFile

Предыдущий способ поиска обладает существенным недостатком – ограниченным числом каталогов диска, подвергающихся просмотру в процессе поиска. По этой причине он не может быть использован для поиска в пределах всего диска. Этот недостаток устраняется при втором способе поиска – с использованием функций FindFirstFile, FindNExtFile и структуры WIN32FINDDATA. Этот способ реализует определенный алгоритм поиска. Вначале вызывается функция FindFirstFile, которая имеет два параметра:

  • lpFileName – указатель на ASCII-строку с именем файла;
  • lpFindFileData – указатель на экземпляр структуры WIN32_FIND_OATA.
HANDLE FindFirstFiletLPCTSTR lpFileName. LPWIN32_FIND_DATA lpFindFileData):

Имя файла может содержать символы шаблона * и ?. Кроме того, имя может выражать путь, с которого нужно начинать поиск. Выше, при знакомстве с функциями MS DOS для работы файлами, имеющими длинные имена, приводилось описание структуры WIN32_FIND_DATA и ее полей.

В случае успеха функция FindFirstFile заполняет поля структуры WIN32_FIND_ DATA и возвращает значение дескриптора внутренней структуры в памяти, который впоследствии может быть использован функциями FindNextFile или FindClose. В случае неудачи функция не изменяет содержимое структуры WIN32_FIND_DATA и возвращает значение INVALID_HANDLE_VALUE (EAX=-llo=Offffffffh).

Проанализировав результаты поиска, программа может продолжить или прекратить его. Для продолжения поиска необходимо вызвать функцию FindNExtFiIe.

BOOL FindNextFile (HANDLE hFindFile. LPWIN32_FIND_DATA lpFindFileData):

В качестве параметров используются дескриптор, полученный в регистре ЕАХ в результате поиска функцией FindFirstFile, и указатель на экземпляр структуры WIN32_FIND_DATA. В случае успеха функция FindNextFile возвращает ненулевое значение в регистре ЕАХ и заполняет структуру WIN32FINDDATA. При неудаче – ЕАХ = 0.

Для продолжения поиска при неизменных исходных параметрах поиска функция FindNextFile вызывается циклически.

Для окончания процесса поиска необходимо вызвать функцию FindClose.

BOOL FindCloset HANDLE hFindFile):

Функция FindClose имеет один параметр – дескриптор, полученный функций FindFirstFile в начале поиска. В случае успеха функция FindClose возвращает Е ненулевое значение в регистре ЕАХ, при неудаче – ЕАХ = 0.

Файлы, отображаемые в память

Платформа Win32 позволяет организовать работу с содержимым файла как с областью оперативной памяти, без использования операций файлового ввода-вывода. Этот механизм отображает (проецирует) содержимое файла на область императивной памяти. Программе передается адрес этой области, после этого работа с содержимым файла осуществляется командами работы с памятью.

Для "проецирования" файла необходимо выполнить следующие действия.

Действие 1.
Требуется создать (для несуществующего файла) или открыть (для существующего файла) объект ядра файл. Цель этого шага – сообщить системе, где находится физическое представление файла. Создание или открытие объекта ядра файл производится с помощью функции CreateFile (см. выше). Все параметры этой функции задаются обычным образом. На выходе в случае успеха функция формирует дескриптор (в регистре ЕАХ), в обратном случае – значение INVALID_HANDLE_VALUE (ЕАХ-llo=Offffffffh).

Действие 2.
Требуется создать объект ядра проекция файла. Цель этого шага – сообщить системе размер проецируемого файла. Для этого используется функция CreateFiIeMapping:

HANDLE CreateFileMapping (HANDLE hFile. LPSECURITY_ATTRIBUTES
ipFileMappingAttributes DWORD flProtect.
DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow. LPCTSTR ipName);

Параметр hFile является дескриптором файла, полученным функцией CreateFile. Параметр ipFileMappingAttributes – указатель на экземпляр структуры SECURITYATTRIBUTES, которая служит для установки защиты. Присвойте параметру lpFileMappingAttributes значение NULL. Параметр flProtect предназначен для установки атрибутов защиты страниц физической памяти в адресном пространстве процесса, на которые отображается файл. Используют один из следующих атрибутов:

  • PAGE_READONLY=02 – доступ к файлу только по чтению (при использовании этого параметра вызов CreateFile должен был производиться с флагом GENERIC_READ);
  • PAGEREADWRI TE=04 – доступ к файлу только по записи (при использовании этого параметра вызов CreateFile должен был производиться с флагом GENERICREAD | GENERICWRITE);
  • PAGE_WRITECOPY=08 – доступ к файлу по чтению-записи с созданием копии данных из файла, при этом исходный файл не изменяется, изменения касаются лишь модифицированных страниц копии в страничном файле (при использовании этого параметра вызов CreateFile должен был производиться с флагом GENERIC_READ или GENERIt_READ|GENERIC_WRITE).

Параметры dwMaximumSizeHigh и dwMaximumSizeLow предназначены для того, чтобы сообщить системе максимальный размер файла в байтах. При этом в dwMaximumSizeLow указываются младшие 32 бита этого значения, а в dwMaximumSizeHigh – старшие 32 бита. Если предполагается размер файла, равный текущей его длине, то следует при вызове функции передать dwMaxi ¦ mumSizeLow=dwMaximumSizeHigh=NULL.

Последний параметр IpName – указатель на ASCIIZ-строку с именем объекта проецируемый файл для обеспечения доступа к нему других процессов. Обычно задают равным NULL.

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