Работа
с файлами в ОС 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 – мониторинг
изменения атрибутов файлов в заданном каталоге.
Комментариев нет:
Отправить комментарий