enumerazione CF_OPEN_FILE_FLAGS (cfapi.h)

Flag per richiedere varie autorizzazioni per l'apertura di un file.

Sintassi

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
} ;

Costanti

 
CF_OPEN_FILE_FLAG_NONE
Valore: 0x00000000
Nessun flag di file aperto.
CF_OPEN_FILE_FLAG_EXCLUSIVE
Valore: 0x00000001
Se specificato, CfOpenFileWithOplockrestituisce un handle none di condivisione e richiede un rh (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE) oplock nel file.

Una normale chiamata CreateFile che viene aperta per una qualsiasi FILE_EXECUTE | FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | DELETE (o entrambi i GENERIC_READ | GENERIC_WRITE) interromperà il blocco a causa del conflitto di condivisione, come descritto nella sezione Osservazioni . Il proprietario dell'oplock verrà completato e riconosciuto.
CF_OPEN_FILE_FLAG_WRITE_ACCESS
Valore: 0x00000002
Se specificato, CfOpenFileWithOplock tenta di aprire il file o la directory con FILE_READ_DATA/FILE_LIST_DIRECTORY e FILE_WRITE_DATA/FILE_ADD_FILE accesso; in caso contrario, tenta di aprire il file o la directory con FILE_READ_DATA/FILE_LIST_DIRECTORY.
CF_OPEN_FILE_FLAG_DELETE_ACCESS
Valore: 0x00000004
Se specificato, CfOpenFileWithOplock tenta di aprire il file o la directory con l'accesso DELETE; in caso contrario, apre il file normalmente.
CF_OPEN_FILE_FLAG_FOREGROUND
Valore: 0x00000008
Quando viene usato questo flag, CfOpenFileWithOplock non richiede un blocco oplock. Questa operazione deve essere usata quando il chiamante funge da applicazione in primo piano. Ad esempio, non importa se l'handle di file creato da questa API causa violazioni di condivisione per altri chiamanti e non si preoccupa dell'interruzione di eventuali oplock che potrebbero essere già presenti nel file. Quindi, aprono l'handle senza richiedere un oplock.

Nota: Il comportamento in background predefinito richiede un oplock quando si apre l'handle di file in modo che la chiamata non riesca se è già presente un oplock e può essere detto di chiudere il proprio handle se è necessario uscire dal modo per evitare di causare una violazione di condivisione in un secondo momento.
A meno che il chiamante non specifichi CF_OPEN_FILE_FLAG_EXCLUSIVE a CfOpenFileWithOplock, il blocco che ottengono sarà solo OPLOCK_LEVEL_CACHE_READ, non (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE), quindi non ci sarà la protezione delle violazioni di condivisione che un'app in background potrebbe volere normalmente.

Commenti

Un'applicazione in background in genere vuole operare in modo trasparente nei file. In particolare, vogliono evitare di causare violazioni di condivisione ad altri opener (in primo piano). A tale scopo, prendono un (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE) oplock, ad esempio viene concesso usando CF_OPEN_FILE_FLAG_EXCLUSIVE con CfOpenFileWithOplock. Quindi, se un altro opener viene eseguito il cui conflitto tra le modalità di condivisione/accesso richieste con la modalità dell'applicazione in background, l'applicazione in background si interrompe. In questo modo l'app in background chiede all'app di chiudere il relativo handle di file (per un handle Cf, che causa la chiusura dell'handle sottostante reale). Dopo che l'app in background chiude il relativo handle, l'altra richiesta di apertura procede senza riscontrare la violazione della condivisione. Tutto ciò funziona a causa della OPLOCK_LEVEL_CACHE_HANDLE parte dell'oplock. Senza CF_OPEN_FILE_FLAG_EXCLUSIVE, l'oplock ha solo OPLOCK_LEVEL_CACHE_READ protezione, quindi la protezione delle violazioni di condivisione non viene fornita.

Quando CF_OPEN_FILE_FLAG_EXCLUSIVE non è specificato, l'apertura è condivisa e ottiene un OPLOCK_LEVEL_CACHE_READ oplock.

Una normale chiamata CreateFile non interromperà l'oplock. Se il normale CreateFile specifica una modalità di condivisione in conflitto con l'accesso dell'handle Cf(ad esempio, se il normale CreateFile non specifica FILE_SHARE_READ), il normale CreateFile avrà esito negativo con ERROR_SHARING_VIOLATION. Il blocco non interrompe fino a quando l'altro chiamante genera un'I/O in conflitto, ad esempio una scrittura. Quando si verifica l'interruzione di oplock è solo consultiva.

Requisiti

Requisito Valore
Client minimo supportato Windows 10 versione 1709 [solo app desktop]
Server minimo supportato Windows Server 2016 [solo app desktop]
Intestazione cfapi.h

Vedi anche

CfOpenFileWithOplock

CreateFile