LockFileEx 関数 (fileapi.h)
呼び出し元プロセスが排他アクセスできるように、指定したファイルをロックします。 この関数は同期的にも非同期的にも動作でき、排他ロックでも共有ロックでも要求できます。
構文
BOOL LockFileEx(
[in] HANDLE hFile,
[in] DWORD dwFlags,
DWORD dwReserved,
[in] DWORD nNumberOfBytesToLockLow,
[in] DWORD nNumberOfBytesToLockHigh,
[in, out] LPOVERLAPPED lpOverlapped
);
パラメーター
[in] hFile
ファイルへのハンドル。 ハンドルは、GENERIC_READまたはGENERIC_WRITEアクセス権を使用して作成されている必要があります。 詳細については、「 ファイル のセキュリティとアクセス権」を参照してください。
[in] dwFlags
このパラメーターには、次の値の 1 つ以上を指定できます。
値 | 意味 |
---|---|
|
関数は排他ロックを要求します。 それ以外の場合は、共有ロックを要求します。 |
|
要求されたロックを取得できない場合、関数は直ちにを返します。 それ以外の場合は待機します。 |
dwReserved
予約済みパラメーター。は 0 に設定する必要があります。
[in] nNumberOfBytesToLockLow
ロックするバイト範囲の長さの下位 32 ビット。
[in] nNumberOfBytesToLockHigh
ロックするバイト範囲の長さの上位 32 ビット。
[in, out] lpOverlapped
関数がロック要求と共に使用する OVERLAPPED 構造体へのポインター。 この構造体 (必須) には、ロック範囲の先頭のファイル オフセットが含まれています。 hEvent メンバーを有効なハンドルまたはゼロに初期化する必要があります。
戻り値
関数が成功した場合、戻り値は 0 以外 (TRUE) になります。
関数が失敗した場合、戻り値は 0 (FALSE) になります。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
ファイルの領域のロックは、このファイル ハンドルを使用して、指定したリージョンへの共有または排他アクセスを取得するために使用されます。 ロック プロセスによって作成されたプロセスによってファイル ハンドルが継承された場合、子プロセスにはロックされたリージョンへのアクセスは許可されません。 ロック プロセスでファイルが 2 回目に開かれると、その領域のロックが解除されるまで、この 2 番目のハンドルを介して指定されたリージョンにアクセスできません。
排他アクセスのためにファイルの一部をロックすると、ファイルの指定されたリージョンへの読み取りと書き込みの両方の他のすべてのプロセスが拒否されます。 ファイルの現在の終了位置を超える領域をロックすることは、エラーではありません。
共有アクセス用にファイルの一部をロックすると、最初にリージョンをロックするプロセスを含め、ファイルの指定されたリージョンへのすべてのプロセスの書き込みアクセスが拒否されます。 すべてのプロセスで、ロックされたリージョンを読み取ることができます。
ファイルの領域をロックしても、マップされたファイル ビューからの読み取りまたは書き込みが妨げられません。
lockFileEx 関数は、LOCKFILE_FAIL_IMMEDIATELY フラグが指定されていない限り、ファイル ハンドルが非同期 I/O 用に開かれた場合に非同期的に動作します。 既に共有ロックまたは排他ロックを持つファイルの範囲に対して排他ロックが要求された場合、この関数はエラー ERROR_IO_PENDINGを返します。 システムは、ロックが許可された後、 OVERLAPPED 構造体で指定されたイベントを通知します。 ロックが付与されたタイミングを確認するには、 GetOverlappedResult 関数または 待機関数のいずれかを使用します。 詳細については、「 同期および非同期 I/O」を参照してください。
非同期 I/O 用にファイル ハンドルが開かされておらず、ロックが使用できない場合、この呼び出しは、 LOCKFILE_FAIL_IMMEDIATELY フラグが指定されていない限り、ロックが許可されるかエラーが発生するまで待機します。
排他ロックは、ファイルの既存のロックされた領域と重複できません。 共有ロックは、そのリージョンで保持されているロックが共有ロックである場合、ロックされたリージョンと重複する可能性があります。 共有ロックは、両方のロックが同じファイル ハンドルを使用して作成された場合、排他ロックと重複する可能性があります。 共有ロックが排他ロックと重複する場合、使用可能なアクセスはロックの所有者による読み取りのみです。 排他ロックと共有ロックで同じ範囲がロックされている場合、リージョンのロックを解除するには 2 つのロック解除操作が必要です。最初のロック解除操作は排他ロックのロックを解除し、2 番目のロック解除操作は共有ロックのロックを解除します。
プロセスがファイルの一部をロックして終了するか、未処理のロックを持つファイルを閉じると、ロックはオペレーティング システムによってロック解除されます。 ただし、オペレーティング システムがこれらのロックを解除するまでにかかる時間は、使用可能なシステム リソースによって異なります。 そのため、プロセスが終了したときにロックされているすべてのファイルのロックを明示的に解除することをお勧めします。 これが行われていない場合は、オペレーティング システムでロックが解除されていない場合、これらのファイルへのアクセスが拒否される可能性があります。
Windows 8 と Windows Server 2012 では、この関数は、次のテクノロジによってサポートされています。
テクノロジ | サポートされています |
---|---|
サーバー メッセージ ブロック (SMB) 3.0 プロトコル | はい |
SMB 3.0 Transparent Failover (TFO) | はい |
スケールアウト ファイル共有 (SO) を使う SMB 3.0 | はい |
クラスターの共有ボリューム ファイル システム (CsvFS) | はい |
Resilient File System (ReFS) | はい |
必要条件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | fileapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |