Наиболее интересным аргументом функции CreateFile() является предпо-
следний, шестой аргумент, который является набором флагов доступа к файлу
и атрибутов файловой системы. Используя различные комбинации флагов
(табл. 4.2), можно настроить доступ к файлу самым причудливым образом.
Например, можно приказать системе удалить файл сразу же после того, как он
будет закрыт, или объявить, что файл будет использоваться для перекрываю-
щегося (overlapped) доступа (перекрывающийся доступ – базовый метод осу-
ществления асинхронного ввода/вывода). Помимо прочего, флаги позволяют
управлять механизмом кэширования.
Таблица 4.2
Флаг Значение
FILE_FLAG_WRITE-
_THROUGH
Приказывает Windows осуществлять немедленную запись
данных на диск. Система может по-прежнему кэшировать опе-
рации записи, однако она будет стараться немедленно
записывать данные на диск, избегая задержек
FILE_FLAG_NO_BU-
FFERING
Приказывает системе открыть файл без использования кэши-
рования или буферизации. В комбинации с флагом
FILE_FLAG_OVERLAPPED это дает максимальную произво-
дительность при асинхронном вводе/выводе, так как осуществ-
ление ввода/вывода не зависит от функционирования менедже-
ра памяти, работа которого обычно синхронизируется. Вместе
с тем некоторые операции ввода/вывода могут потребовать
больше времени для своего завершения, так как данные не со-
храняются в кэше. Чтобы работать с файлами, открытыми в
режиме FILE_FLAG_NO_BUFFERING, приложение должно
удовлетворять определенным требованиям. В частности, жест-
кие требования предъявляются к начальному смещению, размеру
блока и адресу буферов хранения данных
FILE_FLAG_RAN-
DOM_ACCESS
Оповещает систему о том, что доступ к файлу осуществляет-
ся случайным образом. Система может использовать это об-
стоятельство для оптимизации кэширования файла
FILE_FLAG_SEQU-
ENTIAL_SCAN
Оповещает систему о том, что доступ к файлу осуществляет-
ся последовательно от начала к концу файла. Система может
использовать это обстоятельство для оптимизации кэширова-
ния файла. Если в этом режиме указатель доступа к файлу пе-
реместить в случайное место файла, операция чтения/записи
будет выполнена корректно, однако при этом кэш не будет ис-
пользован наиболее оптимальным образом
FILE_FLAG_OVER-
LAPPED
Приказывает системе инициализировать объект для перекры-
вающегося ввода/вывода
FILE_FLAG_DELE-
TE_ON_CLOSE
Приказывает системе уничтожить файл сразу же после того,
как все его дескрипторы будут закрыты. Обратите внимание,
что закрыть необходимо не только дескриптор, который был
получен с использованием флага
FILE_FLAG_DELETE_ON_CLOSE, но и все остальные деск-
рипторы файла. Если при открытии файла в этом режиме не
был использован режим FILE_SHARE_DELETE, все после-
дующие запросы на открытие файла будут отвергнуты
Окончание табл. 4.2
60