Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
213.38 Кб
Скачать

Файловый ввод-вывод

Дисковые файлы и другие устройства ввода-вывода в Win32 представлены объектами ядра "файл", для доступа к которым используются их описатели (тип данных HANDLE). Напомним, что этот тип совместим с типом "указатель" и фактически задает расположение соответствующего блока информации во внутренних структурах. В отличие от большинства объектов, признаком пустоты или недействительности описателя служит значение INVALID_HANDLE_VALUE, численно равное FFFFFFFFh или –1, а не традиционный NULL (значение 0), что соответствует стандартному устройству ввода. Как следствие, чтение из закрытого описателя в Windows 9x будет связано с клавиатурой (в Windows NT это приводит к немедленной ошибке ввода).

Для того, чтобы создать или открыть файл используется универсальная функция HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttrib, DWORD dwCreation­Disposition, DWORD dwFlagsAndAttribs, HANDLE hTemplateFile).

В зависимости от сочетания параметров поведение функции и результаты ее вызова могут сильно различаться. Фактически посредством ее можно реализовать почти все манипуляции с файлом. Часть параметров достаточно проста и очевидна:

lpFileName – определяет имя файла.

dwDesiredAccess – тип доступа к файлу: GENERIC_READ, GENERIC_WRITE или их сочетание (объединение по ИЛИ).

dwShareMode – определяет режим совместного использования файла различными процессами. Если этот параметр равен нулю, то никакой другой поток не сможет открыть этот же файл. Флаги FILE_SHARE_READ и FILE_SHARE_WRITE или их объединение разрешают другим потокам осуществлять доступ к файлу для чтения или записи.

lpSecurityAttribs – указывает на структуру, описывающую защиту создаваемого объекта ядра, параметры по умолчанию задаются значением NULL.

hTemplateFile – если не NULL, то задает открытый файл, служащий источником (шаблоном) флагов и атрибутов, параметр dwFlagsAndAttributes (см. ниже) в этом случае игнорируется.

Гибкое управление функциональностью вызова достигается параметрами:

dwCreationDisposition – действия функции в зависимости от того, существует ли уже файл с указанным именем: CREATE_NEW (только создавать новый файл), СREATE_ALWAYS (то же, но при существовании такого файла удаляет его), OPEN_EXISTING (только открыть существующий), OPEN_ALWAYS (открыть, при необходимости создать), TRUNCATE_EXISTING (только открыть существующий и удалить прежнее содержимое).

dwFlagsAndAttribs – комбинация атрибутов файла и флагов режима работы с ним.

FILE_ATTRIBUTE_NORMAL – "обычный" файл без специальных атрибутов, не может комбини­роваться с другими;

FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM – стандартныеатрибутыфайлав FAT;

FILE_ATTRIBUTE_ENCRYPTED – для файла применяется прозрачное шифрование;

FILE_ATTRIBUTE_TEMPORARY – временный файл, хранится в памяти, но при закрытии не удаляется;

FILE_FLAG_NO_BUFFERING – запрет кэширования и опережающего чтения;

FILE_FLAG_RANDOM_ACCESS – оптимизация (кэширование) для произвольного доступа;

FILE_FLAG_SEQUENTIAL_SCAN – оптимизация (кэширование) для последовательного доступа;

FILE_FLAG_WRITE_TROUGH – запрет буферизации записи, немедленная запись;

FILE_FLAG_DELETE_ON_CLOSE – удалятьпослезакрытия;

FILE_FLAG_OVERLAPPED – для использования асинхронного ввода-вывода.

В качестве примера не вполне стандартного использования CreateFile приводится фрагмент, осуществляющий удаление файла:

hFile = CreateFile(

lpFileName, //name of file to delete

GENERIC_WRITE, //open for write

0, //no sharing

NULL, //no security attributes

OPEN_EXISTING, //open existing files only

FILE_FLAG_DELETE_ON_CLOSE, //flags and attributes

NULL //use no template file

);

if(hFile != INVALID_HANDLE_VALUE)

CloseHandle(hFile); //close and delete automatically

Win32 предоставляет типовой набор основных синхронных файловых функций. Наиболее значимыми из них являются: ReadFile() и WriteFile()

Формат функций идентичен:

BOOL ReadFile/WriteFile(

HANDLE hFile, //описательфайла

LPVOID lpBuffer, //указатель на буфер

DWORD nBytesToProcess, //требуемое количество обрабатываемых байт

LPDWORD lpProcessedBytes, //количество реально обработанных байт

LPOVERLAPPED lpOverlapped //управляющая структура асинхронного режима

);

Возвращаемое значение: TRUE при успехе, иначе FALSE, возвращает также количество реально обработанных байт.

Параметры:

hHFile – описатель (handle) объекта ядра “файл”, соответствующий открытому дисковому файлу, коммуникационному объекту или устройству.

lpBuffer – буфер для чтения/записи данных (достаточного размера)

nBytesToProcess, nProcessedBytes – требуемый и реально обработанный (прочитанный или записанный) объем данных.

lpOverlapped – указатель на структуру OVERLAPPED (см. ниже).

Структура OVERLAPPED служит в первую очередь для управления асинхронным вводом-выводом (см. ниже), но может также ограниченно использоваться в синхронном режиме. Содержит следующие поля:

Internal – резервировано операционной системой, хранит статус завершения

InternalHigh – резервировано ОС, хранит количество переданных байт

Offset – параметр, начальная позиция чтения/записи в файле

OffsetHigh – параметр, старшее слово смещения, при работе с трубопроводами и устройствами игнорируется

hEvent – параметр, описатель события по завершении операции.

При использовании асинхронного режима значение поля Internal можно считать валидным после того, как функция GetOverlappedResult перестанет возвращать значение ERROR_IO_PENDING.

Ненулевая позиция чтения/записи ("курсор" файла) может быть задана только для объектов, поддерживающих ее. В противном случае выполнение функции будет неуспешно.

Имеются также "расширенные" варианты этих функций:

ReadFileEx и WriteFileEx,

Формат функций:

BOOL ReadFileEx/WriteFileEx(

HANDLE hFile, //описательфайла

LPVOID lpBuffer, //указатель на буфер

DWORD nBytesToProcess, //требуемое количество обрабатываемых байт

LPOVERLAPPED lpOverlapped //управляющая структура

LPOVERLAPPED_COMPLETION_ROUTINElpRoutine //метод завершения

);

Возвращаемое значение и все параметры совпадающие параметры аналогичны предыдущим двум функциям, за исключением дополнительного параметра

LPOVERLAPPED_COMPLETION_ROUTINE lpRoutine – метод (функция), которому передается управление по завершении операции, используется в асинхронном режиме (см. ниже).

В зависимости от используемых параметров, указанные функции могут обслуживать файловый ввод-вывод в синхронном и асинхронном режимах.

Х.2.1 Организация синхронного ввода-вывода

Отличительной особенностью синхронного доступа является то, что после инициирования операции исполнение прикладной программы (точнее, инициировавшего эту операцию потока) приостанавливается до ее окончания, после чего программа получает результат операции. Данный режим наиболее естественен, поддерживается во всех системах и может считаться базовым.

Отметим, что альтернативой синхронному файловому вводу-выводу в Win32 является проецирование файлов, что в большинстве случаев более удобно и функционально.

Для использования функций файлового ввода-вывода в синхронном режиме требуется лишь открыть (создать) его функцией CreateFile() без установленного флага FILE_­FLAG_­OVERLAPPED в параметре dwFlagsAndAttributes. После этого функции ReadFile() и WriteFile() могут как опускать параметр lpOverlapped (значение NULL), так и использовать его, получая тем самым возможность явно задавать позицию чтения/записи при каждом вызове, прочая функциональность данной структуры не задействуется. Позиция "курсора" в файле имеет смысл только для объектов, которые ее реально поддерживают. Для объектов последовательного доступа, например, трубопроводов, попытка изменить позицию завершается как неуспешная.

Х.2.2 Организация асинхронного ввода-вывода

При асинхронной работе с файлами прикладная программа, инициировав операцию ввода вывода, не ожидает ее завершения, а продолжает исполняться. Система предоставляет естественные средства для синхронизации программы с инициированными ею операциями. Данный режим поддерживается в полной мере в Windows NT, Windows 95 ограничивает его применимость только коммуникационными ресурсами (транспортеры, почтовые ящики), портами и сокетами, но не дисковыми файлами.

Для организации асинхронного режима необходимо при вызове функции CreateFile() установить флаг FILE_FLAG_OVERLAPPED в параметре dwFlagsAnd­Attributes. Далее, используются те же функции ввода-вывода, но обязательно с заполненной управляющей структурой, передаваемой параметром lpOverlapped. Отметим, что здесь, отличие от синхронных операций, необходимо явно указать позицию курсора в файле, так как несколько операций чтения и записи могут производиться в одном и том же файле одновременно, и, следовательно, единой определенной текущей позиции не существует.

12.

13. = 21.

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