Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

10.3. Функции ядра Windows для работы с файлами

В Win32 API появились принципиально новые 32-х разрядные функции. Именно они рекомендуются для разработчиков, поскольку дают несомненные преимущества от использования Win32 API в сравнении с потоковым вводом/выводом:

- высокая скорость дискового обмена данными;

- произвольная длина файла, точнее обрабатываются файлы с длиной до 264 байт;

- обеспечивается переносимость программного кода на другие платформы (PowerPC, Alpha и MIPS).

Кроме того, Win32 API функции позволяют работать со следующими Windows объектами: 1) дисковые файлы; 2) каналы (pipes); 3) почтовые слоты (mailslots); 4) коммуникационные устройства (модемы); 5) консоли (consoles).

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

1. Стартовой функцией является CreateFile(), которая позволяет создать или открыть перечисленные выше объекты.

HANDLE CreateFile ( LPCTSTR szFileName, DWORD dwAccess, DWORD dwShareMode, SECURITY_ATTRIBUTES* pSecurityAttr, DWORD dwCreation, DWORD dwFlags, HANDLE hTemplateFile)

Здесь:

szFileName

имя Windows объекта. Имя может содержать пробелы;

dwAccess

режим открытия;

dwShareMode

режим доступа;

pSecurityAttr

указатель на структуру SECURITY_ATTRIBUTES. Обычно равен NULL;

dwCreation

режим создания;

dwFlags

флаги атрибутов. Особо следует упомянуть о флаге FILE_FLAG_OVERLAPPED, который задает асинхронные операции с файлом;

hTemplateFile

дескриптор ранее открытого файла, атрибуты которого берутся за образец при создании нового файла.

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

Приведем типичные примеры.

Открыть существующий файл на чтение можно следующим образом:

HANDLE hFile = CreateFile ("Just File.txt", GENERIC_READ, FILE_SHARE_READ, // разделение на чтение NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Создать новый или перезаписать существующий файл в монопольном режиме можно так:

HANDLE hFile = CreateFile ("New_Just_File.txt", GENERIC_WRITE, 0, // монопольный режим NULL, CREATE_ALWAYS, // перезапись существующего FILE_ATTRIBUTE_NORMAL, NULL);

2. После окончания работы с объектом, открытым с помощью функции CreateFile(), его обязательно нужно закрыть для освобождения внутренних ресурсов

CloseHandle(hFile);

3. Получить размер файла hFile произвольной длины можно через функцию

DWORD GetFileSize (HANDLE hFile, LPDWORD pSizeHigh),

которая возвращает младшие четыре байта длины, а параметр pSizeHigh указывает на переменную, содержащую старшие четыре байта. Таким образом, результирующее значение длины файла составляет восемь байт.

4. Прочитать nBytes байт в буфер pBuffer можно через вызов:

BOOL ReadFile (HANDLE hFile, LPVOID pBuffer, DWORD nBytes, LPDWORD pBytesReaded, OVERLAPPED* pOverlapped)

при этом в переменную, адрес которой передается через pBytesReaded, будет записано реальное количество прочитанных байт. Если указатель pOverlapped равен NULL, то выполняется синхронное чтение информации. Это означает, что возврат из функции произойдет только после того, как будет выполнено чтение указанных nBytes байт или возникнет ошибка. Если параметр pOverlapped указывает на структуру OVERLAPPED, выполняется асинхронное чтение, когда ReadFile() немедленно возвращает управление, а для установления момента окончания чтения нужно предусмотреть специальный код.

5. Записать nBytes из буфера pBuffer в файл можно через вызов:

BOOL WriteFile(HANDLE hFile, LPCVOID pBuffer, DWORD nBytes, LPDWORD pBytesWritten, OVERLAPPED* pOverlapped)

Функция возвращает TRUE, если операция выполнена успешно. Остальные параметры соответствуют функции ReadFile().

6. Для перемещения файлового указателя используется вызов:

DWORD SetFilePointer (HANDLE hFile, LONG Len, PLONG pLenHigh, DWORD dwMethod)

Новое положение файлового указателя задается двумя переменными типа LONGLen (младшее двойное слово) и pLenHigh (старшее двойное слово). Параметр dwMethod задает направление перемещения и принимает три значения: FILE_BEGIN, FILE_CURRENT и FILE_END.

Функция возвращает младшее двойное слово нового положения файлового указателя, а старшее двойное слово передается через переменную, адрес которой указан на третьем позиции.