Работа с дисками, каталогами и организация поиска файлов
Поиск файлов с помощью функций 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.