Win32 API 日本語リファレンス
ホームStorage.CloudFilters › CF_OPEN_FILE_FLAGS

CF_OPEN_FILE_FLAGS

列挙型フラグ
基底型i4

メンバー 5

名前10進16進説明
CF_OPEN_FILE_FLAG_NONE00x0ファイルオープンフラグを指定しません。
CF_OPEN_FILE_FLAG_EXCLUSIVE10x1

指定した場合、CfOpenFileWithOplock共有なし のハンドルを返し、そのファイルに対して RH (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE) の oplock を要求します。

FILE_EXECUTE | FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | DELETE のいずれか (または GENERIC_READ | GENERIC_WRITE のいずれか、もしくは両方) でオープンする通常の CreateFile 呼び出しは、解説 セクションで説明するとおり、共有の競合によって oplock を解除します。oplock の所有者は処理を完了して確認応答することができます。

CF_OPEN_FILE_FLAG_WRITE_ACCESS20x2指定した場合、CfOpenFileWithOplockFILE_READ_DATA/FILE_LIST_DIRECTORY および FILE_WRITE_DATA/FILE_ADD_FILE アクセスでファイルまたはディレクトリを開こうとします。指定しない場合は、FILE_READ_DATA/FILE_LIST_DIRECTORY でファイルまたはディレクトリを開こうとします。
CF_OPEN_FILE_FLAG_DELETE_ACCESS40x4指定した場合、CfOpenFileWithOplock は DELETE アクセスでファイルまたはディレクトリを開こうとします。指定しない場合は、通常どおりファイルを開きます。
CF_OPEN_FILE_FLAG_FOREGROUND80x8

このフラグを使用すると、CfOpenFileWithOplock は oplock を要求しません。これは、呼び出し元がフォアグラウンドアプリケーションとして動作している場合に使用します。つまり、この API によって作成されたファイルハンドルが他の呼び出し元に対して共有違反を引き起こすかどうかを気にせず、また、そのファイルに既に設定されている oplock を解除することも気にしない場合です。そのため、oplock を要求せずにハンドルを開きます。

注: 既定の バックグラウンド 動作では、ファイルハンドルを開く際に oplock を要求します。これにより、既に oplock が存在する場合は呼び出しが失敗し、後で共有違反を引き起こさないように処理を譲る必要があるときは、ハンドルを閉じるよう通知を受けられます。
呼び出し元が CfOpenFileWithOplockCF_OPEN_FILE_FLAG_EXCLUSIVE を指定しない限り、取得できる oplock は (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE) ではなく OPLOCK_LEVEL_CACHE_READ のみとなるため、バックグラウンドアプリケーションが通常必要とする共有違反の保護は得られません。

公式ドキュメント

ファイルを開く際にさまざまな権限を要求するためのフラグです。

解説(Remarks)

バックグラウンドアプリケーションは通常、ファイルに対して透過的に動作することを望みます。特に、他の (フォアグラウンドの) オープン元に対して共有違反を引き起こすことを避けたいと考えます。そのために、CfOpenFileWithOplockCF_OPEN_FILE_FLAG_EXCLUSIVE を使用した場合に付与されるような (OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE) の oplock を取得します。その後、要求する共有モードやアクセスモードがバックグラウンドアプリケーションのモードと競合する別のオープン元が現れると、バックグラウンドアプリケーションの oplock が解除されます。これにより、バックグラウンドアプリケーションはファイルハンドルを閉じるよう促されます (Cf ハンドルの場合、ハンドルは無効になります。実際の基になるハンドルは閉じられています)。バックグラウンドアプリケーションがハンドルを閉じると、もう一方のオープン要求は共有違反に遭遇することなく続行されます。これらはすべて oplock の OPLOCK_LEVEL_CACHE_HANDLE の部分によって機能します。CF_OPEN_FILE_FLAG_EXCLUSIVE を指定しない場合、oplock は OPLOCK_LEVEL_CACHE_READ の保護しか持たないため、共有違反に対する保護は提供されません。

CF_OPEN_FILE_FLAG_EXCLUSIVE を指定しない場合、オープンは すべて共有 となり、OPLOCK_LEVEL_CACHE_READ の oplock が取得されます。

通常の CreateFile 呼び出しでは oplock は解除されません。通常の CreateFile が Cf ハンドルのアクセスと競合する共有モードを指定した場合 (たとえば、通常の CreateFileFILE_SHARE_READ を指定しない場合)、通常の CreateFileERROR_SHARING_VIOLATION で失敗します。oplock は、他の呼び出し元が書き込みなどの競合する I/O を発行するまで解除されません。その場合、oplock の解除は勧告的なものにすぎません

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

列挙メンバーの定義。HSP タブは #define global(値は16進)。

typedef enum CF_OPEN_FILE_FLAGS : int {
    CF_OPEN_FILE_FLAG_NONE = 0,
    CF_OPEN_FILE_FLAG_EXCLUSIVE = 1,
    CF_OPEN_FILE_FLAG_WRITE_ACCESS = 2,
    CF_OPEN_FILE_FLAG_DELETE_ACCESS = 4,
    CF_OPEN_FILE_FLAG_FOREGROUND = 8
} CF_OPEN_FILE_FLAGS;
[Flags]
public enum CF_OPEN_FILE_FLAGS : int
{
    CF_OPEN_FILE_FLAG_NONE = 0,
    CF_OPEN_FILE_FLAG_EXCLUSIVE = 1,
    CF_OPEN_FILE_FLAG_WRITE_ACCESS = 2,
    CF_OPEN_FILE_FLAG_DELETE_ACCESS = 4,
    CF_OPEN_FILE_FLAG_FOREGROUND = 8,
}
<Flags>
Public Enum CF_OPEN_FILE_FLAGS As Integer
    CF_OPEN_FILE_FLAG_NONE = 0
    CF_OPEN_FILE_FLAG_EXCLUSIVE = 1
    CF_OPEN_FILE_FLAG_WRITE_ACCESS = 2
    CF_OPEN_FILE_FLAG_DELETE_ACCESS = 4
    CF_OPEN_FILE_FLAG_FOREGROUND = 8
End Enum
import enum

class CF_OPEN_FILE_FLAGS(enum.IntFlag):
    CF_OPEN_FILE_FLAG_NONE = 0
    CF_OPEN_FILE_FLAG_EXCLUSIVE = 1
    CF_OPEN_FILE_FLAG_WRITE_ACCESS = 2
    CF_OPEN_FILE_FLAG_DELETE_ACCESS = 4
    CF_OPEN_FILE_FLAG_FOREGROUND = 8
// CF_OPEN_FILE_FLAGS (flags)
pub const CF_OPEN_FILE_FLAG_NONE: i32 = 0;
pub const CF_OPEN_FILE_FLAG_EXCLUSIVE: i32 = 1;
pub const CF_OPEN_FILE_FLAG_WRITE_ACCESS: i32 = 2;
pub const CF_OPEN_FILE_FLAG_DELETE_ACCESS: i32 = 4;
pub const CF_OPEN_FILE_FLAG_FOREGROUND: i32 = 8;
// CF_OPEN_FILE_FLAGS
const (
	CF_OPEN_FILE_FLAG_NONE int32 = 0
	CF_OPEN_FILE_FLAG_EXCLUSIVE int32 = 1
	CF_OPEN_FILE_FLAG_WRITE_ACCESS int32 = 2
	CF_OPEN_FILE_FLAG_DELETE_ACCESS int32 = 4
	CF_OPEN_FILE_FLAG_FOREGROUND int32 = 8
)
const
  CF_OPEN_FILE_FLAG_NONE = 0;
  CF_OPEN_FILE_FLAG_EXCLUSIVE = 1;
  CF_OPEN_FILE_FLAG_WRITE_ACCESS = 2;
  CF_OPEN_FILE_FLAG_DELETE_ACCESS = 4;
  CF_OPEN_FILE_FLAG_FOREGROUND = 8;
// CF_OPEN_FILE_FLAGS
pub const CF_OPEN_FILE_FLAG_NONE: i32 = 0;
pub const CF_OPEN_FILE_FLAG_EXCLUSIVE: i32 = 1;
pub const CF_OPEN_FILE_FLAG_WRITE_ACCESS: i32 = 2;
pub const CF_OPEN_FILE_FLAG_DELETE_ACCESS: i32 = 4;
pub const CF_OPEN_FILE_FLAG_FOREGROUND: i32 = 8;
const
  CF_OPEN_FILE_FLAG_NONE* = 0
  CF_OPEN_FILE_FLAG_EXCLUSIVE* = 1
  CF_OPEN_FILE_FLAG_WRITE_ACCESS* = 2
  CF_OPEN_FILE_FLAG_DELETE_ACCESS* = 4
  CF_OPEN_FILE_FLAG_FOREGROUND* = 8
enum CF_OPEN_FILE_FLAGS : int {
    CF_OPEN_FILE_FLAG_NONE = 0,
    CF_OPEN_FILE_FLAG_EXCLUSIVE = 1,
    CF_OPEN_FILE_FLAG_WRITE_ACCESS = 2,
    CF_OPEN_FILE_FLAG_DELETE_ACCESS = 4,
    CF_OPEN_FILE_FLAG_FOREGROUND = 8,
}
#define global CF_OPEN_FILE_FLAG_NONE          0x0
#define global CF_OPEN_FILE_FLAG_EXCLUSIVE     0x1
#define global CF_OPEN_FILE_FLAG_WRITE_ACCESS  0x2
#define global CF_OPEN_FILE_FLAG_DELETE_ACCESS 0x4
#define global CF_OPEN_FILE_FLAG_FOREGROUND    0x8
; ※フラグ列挙型。ビットORで組み合わせ可(例: FOO|BAR)。