Поделиться через


перечисление CF_OPEN_FILE_FLAGS (cfapi.h)

Флаги для запроса различных разрешений на открытие файла.

Синтаксис

typedef enum CF_OPEN_FILE_FLAGS {
  CF_OPEN_FILE_FLAG_NONE = 0x00000000,
  CF_OPEN_FILE_FLAG_EXCLUSIVE = 0x00000001,
  CF_OPEN_FILE_FLAG_WRITE_ACCESS = 0x00000002,
  CF_OPEN_FILE_FLAG_DELETE_ACCESS = 0x00000004,
  CF_OPEN_FILE_FLAG_FOREGROUND = 0x00000008
} ;

Константы

 
CF_OPEN_FILE_FLAG_NONE
Значение: 0x00000000
Флаги открытых файлов отсутствуют.
CF_OPEN_FILE_FLAG_EXCLUSIVE
Значение: 0x00000001
Если этот параметр указан, CfOpenFileWithOplock возвращает дескриптор общей папки и запрашивает RH (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE) для файла.

Обычный вызов CreateFile , который открывается для любого из FILE_EXECUTE | FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | DELETE (или оба GENERIC_READ | GENERIC_WRITE) разорвёт блокировку из-за конфликта общего доступа, как описано в разделе Примечания . Владелец oplock получит, чтобы закончить и подтвердить.
CF_OPEN_FILE_FLAG_WRITE_ACCESS
Значение: 0x00000002
Если этот параметр указан, CfOpenFileWithOplock пытается открыть файл или каталог с помощью FILE_READ_DATA/FILE_LIST_DIRECTORY и FILE_WRITE_DATA/FILE_ADD_FILE доступа; в противном случае он пытается открыть файл или каталог с помощью FILE_READ_DATA/FILE_LIST_DIRECTORY.
CF_OPEN_FILE_FLAG_DELETE_ACCESS
Значение: 0x00000004
Если этот параметр указан, CfOpenFileWithOplock пытается открыть файл или каталог с доступом DELETE; В противном случае файл открывается обычным образом.
CF_OPEN_FILE_FLAG_FOREGROUND
Значение: 0x00000008
При использовании этого флага CfOpenFileWithOplock не запрашивает блокировку. Этот параметр следует использовать, когда вызывающий объект выступает в качестве приложения переднего плана. Т. е. им не важно, вызывает ли дескриптор файла, созданный этим API, нарушения общего доступа для других вызывающих абонентов, и их не волнует нарушение блокировки, которые уже могут быть в файле. Таким образом, они открывают дескриптор без запроса блокировки.

Примечание: Фоновое поведение по умолчанию запрашивает блокировку при открытии дескриптора файла, чтобы их вызов завершился сбоем, если уже есть блокировка, и им можно приказать закрыть свой дескриптор, если им потребуется выйти из пути, чтобы избежать нарушения общего доступа в дальнейшем.
Если вызывающий объект не указывает CF_OPEN_FILE_FLAG_EXCLUSIVE в CfOpenFileWithOplock, операция будет получаться только OPLOCK_LEVEL_CACHE_READ, а не (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE), поэтому защита от нарушений общего доступа обычно может потребоваться фоновому приложению.

Комментарии

Фоновое приложение обычно хочет прозрачно работать с файлами. В частности, они хотят избежать нарушений общего доступа к другим (переднему плану) открывателям. Для этого они принимают (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE), например, с помощью CF_OPEN_FILE_FLAG_EXCLUSIVE с CfOpenFileWithOplock. Затем, если появляется другое средство открытия, запрошенные режимы общего доступа и доступа которых конфликтуют с режимом фонового приложения, блокировка фонового приложения прерывается. Это предложит фоновому приложению закрыть дескриптор файла (для дескриптора Cf, что приводит к тому, что он становится недействительным — реальный базовый дескриптор был закрыт). Когда фоновое приложение закрывает свой дескриптор, другой запрос на открытие продолжается без нарушения общего доступа. Все это работает из-за OPLOCK_LEVEL_CACHE_HANDLE частью oplock. Без CF_OPEN_FILE_FLAG_EXCLUSIVE блокировка имеет только защиту OPLOCK_LEVEL_CACHE_READ, поэтому защита от нарушения общего доступа не предоставляется.

Если CF_OPEN_FILE_FLAG_EXCLUSIVE не указан, открытый объект получает общий доступ ко всем и получает OPLOCK_LEVEL_CACHE_READ блокировку.

Обычный вызов CreateFile не приведет к прерыванию блокировки. Если обычный файл CreateFile задает режим общего доступа, конфликтующий с доступом дескриптора Cf (например, если обычный файл CreateFile не указывает FILE_SHARE_READ), обычный файл CreateFile завершится сбоем с ERROR_SHARING_VIOLATION. Блокировка не прерывается до тех пор, пока другой вызывающий объект не выпустит конфликтующий ввод-вывод, например запись. Когда это происходит , разрыв блокировки является только рекомендацией.

Требования

Требование Значение
Минимальная версия клиента Windows 10, версия 1709 [только классические приложения]
Минимальная версия сервера Windows Server 2016 [только классические приложения]
Верхняя часть cfapi.h

См. также раздел

CfOpenFileWithOplock

CreateFile