ОС Windows: работа с файлами: синхронная и асинхронная.


Работа с файлами в ОС WINDOWS организована на др. уровне по сравнению с ОС UNIX
      CreateFile – данная функция открывает и создает файл, однако этим её возможности не исчерпываются. Перечислим объекты которые можно открыть при помощи этой функции:
1)    файлы
2)    консольные потоки
3)    коммуникационные ресурсы (порты компов COM, LPT)
4)    каталоги
5)    дисковые устроцства
6)    дрова
7)    почтовые ящики
8)    каналы
Все перечисленные объекты закрываются стандартной функцией CloseHandle.

      Однако после получения дескриптора на объект дальнейшая работа ведется с помощью различных функций зависящих от типа объекта. После получения дескриптора на объект работа с объектом идет по одному из 2-ух направлений:
1)    файлы, конс. потоки, ком. потоки, почтовые ящики, каналы
2)    каталоги, дисковые устройства, дрова
Первое направление используется для обмена данными, ф-ции:
            ReadFile
            ReadFileEx
            WriteFile
            WriteFileEx
Второе:
            DeviceIoControl
Помимо этого для каждого конкретного объекта имеется набор функций специфичных для данного типа объекта.
      Основное отличие ф-ций чтения и записи в файл в ОС WINDOWS от соответствующих функций в ОС UNIX (Read, Write) заключается в том, что в WINDOWS возможна как синхронное так и асинхронное выполнение файловых операций
      Рассмотрим первое направление работы с объектом.

Функция CreateFile задает будет ли производиться буферизация при работе с файлом, а также дисципл. реализ-ции. Для последовательного или случайного доступа внутри файла. Таким образом буферизация выполняется ядром ОС, а не прикладной библиотекой как в UNIX. В ОС Windows возможно выполнение как синхронных так и асинхронных операций чтения и записи в файл. Физический смысл синхронной операции => возврат из функции чтения (записи) происходит сразу же после начала операции, а не после её окончания. Прога может продолжать своё выполнение, но при этом  // с ней будет выполняться операция работы с файлами. После того как закончится работа с файлами взводится специальное событие сигнализирующее об окончании операции

HANDLE CreateFile(
LPCSTR   LpFileName,
DWORD   dwDesinedAcces,
DWORD   dwShareMode,
LPSECURITY_ATTRIBUTES psa,
DWORD    dwCreationDisposition,
DWORD    dwFlagsandAttributes,
HANDLE   hTemplateFile),        
Первый параметр – имя файла
Второй параметр – желаемый доступ
Третий параметр – будет ли разделяться доступ к этому файлу. Различные разделения доступа на чтение, удаление и запись.
Четвертый – атрибут безопасности
Пятый – способ создания. Различают: создать
по любому (CreateAlways)
открыть в любом случае
обрезать файл до нуля
создать новый 
Шестой – флаги и атрибуты можно задать в этом параметре, а можно воспользоваться следующим параметром, тогда при создании нового файла все его атрибуты будут взяты из шаблона.
Флаги: FILE_FLAG_NO_BUFFERING – выключить буферизацию файла
            FILE_FLAG_DELITE_ON_CLOSE – удалить файл после закрытия
            FILE_FLAG_OVERLAPPED – доступ к файлу будет организован асинхронным образом.
BOOL                ReadFile(
            HANDLE            hFile,
LPVOID lpBuffer,           //буфер
DWORD nNumberOfBytesToRead,           //количество бит которое нужно считать
LPDWORD         lpNumberOfBytesRead,  //количество байт которое считали
LPOVERLAPPED lpOverlapped);  //спец. структура для асинхронных операций, если указать 0, то операция будет синхронной
typedef             struct{
            Ulong_PTR        Internal;           //1
            Ulong_PTR        InternalHigh;     //2
            DWORD Offset;              //3
            DWORD OffsetHigh;       //4
            HANDLE            hEvent; //5
            }OVERLAPPED;
3,4 – смещение от начала файла
1,2 – заполняются нулями, нужны для ОС
5 – описатель событий, также предварительно созданного нами. Событие должно быть с ручным сбросом.
      Как узнать не произошла ли ошибка во время асинхронной операции и сколько бит было прочитано? Для этого есть спец. ф-ция GetOverlappedResult.
Для работы почтового ящика совместно с ждущим таймером следует использовать функции ReadFileEx и WriteFileEx
BOOL                ReadFileEx(
            HANDLE            hFile,
            LPVOID lpBuffer,
DWORD nBytesToRead,
LPOVERLAPPED lpOverlapped
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
VAID     CALLBACK        FileIOCompletion(
                        DWORD dwErrorCode,
                        DWORD             dwNumberOfBytesTransferred,
                        LPOVERLAPPED lpOverlapped);
APC (Asynchronous Procedure Call) – асинхронный вызов процедуры.
Ф-ция FileIOCompletion будет вызвана только в том случае, если нить находится в особом состоянии, так называемым “тревожном” состоянии (alertable state). Нить находится в этом состоянии при выполнении ф-ций с суффиксом Ex. Примеры таких ф-ций:
            SleapEx
            WaitForSingleObjectEx
            WaitForMultipleObjectsEx
Если нить находится в одной из таких ф-ций, и файловая операция завершилась, то будет вызван FileIOCompletion.
APC пользовательского режима отличается от APC ядра.
BOOL                GetOverlappedResult(
            HANDLE            hFile,
            LPOVERLAPPED lpOverlapped,
            LPDWORD         lpNumberOfBytesTransferred,
            BOOL                bWait);
Ф-ция GetOverlappedResult позволяет проверить состояние файловой операции. После её завершения сначала надо проверить состояние (?) и узнать количество переданных байт.
С помощью этой ф-ции можно сделать асинхронную файловую операцию синхронной, передав еденичку в последний параметр.
      Ф-ции FOpen, FRead, FWrite в OC Windows реализованы поверх ф-ций CreateFile, ReadFile, WriteFile.
      Перечислим кратко некоторые другие ф-ции работы с файлами в ОС Windows: CopyFile, CopyFileEx, MoveFile, MoveFileEx (Ex-ф-ция с CALLBACK)
GetPriveType – получение типа носителя информации (CD-ROM=5)
GetFileSize, GetFileSizeEx – получение размера файла в 8-ми байтовом виде
GetFullPathName – получение полного пути до файла по имени файла
SearchPath – поиск пути до исполняемого файла
GetFileAtributs, GetFileAtributsEx – получить атрибуты файла
FindFirstFile, FindNextFile – поиск файлов в каталоге. Обязательно нужно закрывать с помощью FindClose, если этого не сделать ошибки не будет, но ОП на 8 Мб будет меньше.

FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification – мониторинг изменения атрибутов файлов в заданном каталоге.

Комментариев нет:

Отправить комментарий