ReOpenFile 関数 (winbase.h)

異なるアクセス権、共有モード、フラグを使って、指定したファイル システム オブジェクトを再度開きます。

構文

HANDLE ReOpenFile(
  [in] HANDLE hOriginalFile,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwShareMode,
  [in] DWORD  dwFlagsAndAttributes
);

パラメーター

[in] hOriginalFile

再度開くオブジェクトのハンドル。 オブジェクトは CreateFile 関数によって作成されている必要があります。

[in] dwDesiredAccess

オブジェクトへの必要なアクセス。 値の一覧については、「 ファイル のセキュリティとアクセス権」を参照してください。 ハンドルがまだ開いている以前のオープン要求で指定された共有モードと競合するアクセス・モードを要求することはできません。

このパラメーターがゼロ (0) の場合、アプリケーションはデバイスにアクセスせずにデバイス属性のクエリを実行できます。 これは、アプリケーションがフロッピー ディスク ドライブのサイズと、ドライブにフロッピーを必要とせずにサポートされている形式を決定する場合に便利です。

[in] dwShareMode

オブジェクトの共有モード。 ハンドルがまだ開いている以前のオープン要求で指定されたアクセス・モードと競合する共有モードを要求することはできません。

このパラメーターが 0 (0) で CreateFile が成功した場合、オブジェクトは共有できず、ハンドルが閉じられるまでもう一度開くことはできません。

プロセスを開いている間に他のプロセスがオブジェクトを共有できるようにするには、次の値の 1 つ以上を組み合わせて、オブジェクトを開くときに要求できるアクセスの種類を指定します。 これらの共有オプションは、オブジェクトのハンドルを閉じるまで有効です。

説明
FILE_SHARE_DELETE
0x00000004
オブジェクトに対する後続のオープン操作を有効にして、削除アクセスを要求します。 それ以外の場合、削除アクセスを要求した場合、他のプロセスはオブジェクトを開くことができません。

オブジェクトが既に削除アクセスで開かれている場合は、共有モードにこのフラグを含める必要があります。

FILE_SHARE_READ
0x00000001
オブジェクトに対する後続のオープン操作を有効にして、読み取りアクセスを要求します。 それ以外の場合、他のプロセスは、読み取りアクセスを要求する場合、オブジェクトを開くことができません。

オブジェクトが既に読み取りアクセス権で開かれている場合は、共有モードにこのフラグを含める必要があります。

FILE_SHARE_WRITE
0x00000002
オブジェクトに対する後続のオープン操作を有効にして、書き込みアクセスを要求します。 それ以外の場合、他のプロセスは、書き込みアクセスを要求する場合、オブジェクトを開くことができません。

オブジェクトが書き込みアクセス権で既に開かれている場合は、共有モードにこのフラグを含める必要があります。

[in] dwFlagsAndAttributes

ファイル フラグ。 このパラメーターには、次の 1 つ以上の値を指定できます。

説明
FILE_FLAG_BACKUP_SEMANTICS
0x02000000
バックアップまたは復元操作のためにファイルが開かれているか作成されていることを示します。 システムは、SE_BACKUP_NAMEおよびSE_RESTORE_NAME特権がある場合に、呼び出し元プロセスがファイル セキュリティ チェックをオーバーライドすることを保証します。 詳細については、「 トークンでの特権の変更」を参照してください。

このフラグを設定して、ディレクトリへのハンドルを取得することもできます。 指定されている場合、ディレクトリ ハンドルは、ファイル ハンドルの代わりに一部の関数に渡すことができます。

FILE_FLAG_DELETE_ON_CLOSE
0x04000000
オペレーティング システムが、指定したハンドルだけでなく、他の開いているハンドルまたは重複するハンドルだけでなく、すべてのハンドルが閉じられた直後にファイルを削除することを示します。

FILE_SHARE_DELETEを使用しない限り、ファイルに対する後続のオープン要求は失敗します。

FILE_FLAG_NO_BUFFERING
0x20000000
中間バッファリングまたはキャッシュなしでファイルを開くようシステムに指示します。 FILE_FLAG_OVERLAPPEDと組み合わせると、I/O はメモリ マネージャーの同期操作に依存しないため、 フラグによって最大の非同期パフォーマンスが得られます。 ただし、データがキャッシュに保持されていないため、一部の I/O 操作には時間がかかります。

アプリケーションは、 FILE_FLAG_NO_BUFFERINGで開かれたファイルを操作するときに、特定の要件を満たす必要があります。

  • ファイル アクセスは、ボリューム セクター サイズの整数倍数であるファイル内のバイト オフセットから開始する必要があります。
  • ファイル アクセスは、ボリューム セクター サイズの整数倍数であるバイト数に対してである必要があります。 たとえば、セクター サイズが 512 バイトの場合、アプリケーションは 512、1024、1536、または 2048 バイトの読み取りと書き込みを要求できますが、335、981、または 7171 バイトは要求できません。
  • 読み取り操作と書き込み操作のバッファー アドレスは、セクターアラインメント (ボリューム セクター サイズの整数倍数であるメモリ内のアドレスにアライン) する必要があります。 ディスクによっては、この要件が適用されない場合があります。
ボリューム セクター サイズの整数倍数にバッファーを配置する 1 つの方法は、 VirtualAlloc を使用してバッファーを割り当てることです。 オペレーティング システムのメモリ ページ サイズの整数の倍数であるアドレスにアラインされたメモリを割り当てます。 メモリ ページ サイズとボリューム セクター サイズの両方が 2 の累乗であるため、このメモリは、ボリューム セクター サイズの整数倍数であるアドレスにも合わせて調整されます。 メモリ ページのサイズは 4 から 8 KB です。セクターは 512 バイト (ハード ディスク) または 2048 バイト (CD) であるため、ボリューム セクターをメモリ ページよりも大きくすることはできません。

アプリケーションは 、GetDiskFreeSpace 関数を呼び出すことによって、ボリューム セクターのサイズを決定できます。

FILE_FLAG_OPEN_NO_RECALL
0x00100000
ファイル データが要求されたが、リモート ストレージに存在し続ける必要があることを示します。 ローカル ストレージに転送しないでください。 このフラグは、リモート ストレージ システムで使用することを目的としています。
FILE_FLAG_OPEN_REPARSE_POINT
0x00200000
このフラグを使用すると、通常の 再解析ポイント 処理は行われず、 ReOpenFile は再解析ポイントを開こうとします。 ファイルを開くと、再解析ポイントを制御するフィルターが動作可能かどうかに関係なく、ファイル ハンドルが返されます。 このフラグは 、CREATE_ALWAYS フラグでは使用できません。 ファイルが再解析ポイントでない場合、このフラグは無視されます。
FILE_FLAG_OVERLAPPED
0x40000000
処理にかなりの時間がかかる操作がERROR_IO_PENDING を返すように、オブジェクトを初期化するようにシステムに指示します。 操作が完了すると、指定したイベントがシグナル状態に設定されます。

FILE_FLAG_OVERLAPPEDを指定する場合、ファイルの読み取りおよび書き込み関数で OVERLAPPED 構造体を指定する必要があります。 つまり、 FILE_FLAG_OVERLAPPED が指定されている場合、アプリケーションは重複した読み取りと書き込みを実行 する必要があります

FILE_FLAG_OVERLAPPEDが指定されている場合、システムはファイル ポインターを維持しません。 ファイルの位置は、 lpOverlapped パラメーター ( OVERLAPPED 構造体を指す) の一部として、ファイルの読み取りおよび書き込み関数に渡す必要があります。

このフラグを使用すると、複数の操作をハンドルと同時に実行することもできます (たとえば、読み取りと書き込みの同時操作)。

FILE_FLAG_POSIX_SEMANTICS
0x01000000
POSIX 規則に従ってファイルにアクセスすることを示します。 これには、このような名前付けをサポートするファイル システムに対して、名前が異なる複数のファイルを許可することが含まれます。 MS-DOS または 16 ビット Windows 用に作成されたアプリケーションでは、このフラグで作成されたファイルにアクセスできない可能性があるため、このオプションを使用する場合は注意が必要です。
FILE_FLAG_RANDOM_ACCESS
0x10000000
ファイルがランダムにアクセスされることを示します。 システムはこれをヒントとしてファイルのキャッシュを最適化します。
FILE_FLAG_SEQUENTIAL_SCAN
0x08000000
ファイルは先頭から末尾まで順次アクセスされることを示します。 システムはこれをヒントとしてファイルのキャッシュを最適化します。 アプリケーションがランダム アクセスのファイル ポインターを移動させると、最適なキャッシングが行われない場合があります。ただし、操作は引き続き正常に実行されます。

このフラグを指定すると、シーケンシャル アクセスを使用して大きなファイルを読み取るアプリケーションのパフォーマンスが向上する可能性があります。 大きなファイルを主に順番に読み取るが、小さなバイト範囲をスキップする場合があるアプリケーションでは、パフォーマンスの向上がさらに顕著になる可能性があります。

FILE_FLAG_WRITE_THROUGH
0x80000000
中間キャッシュを介して書き込み、ディスクに直接移動するようにシステムに指示します。 システムは書き込み操作をキャッシュすることはできますが、遅延フラッシュすることはできません。
 

ハンドルが名前付きパイプのクライアント側を表す場合は、 dwFlags パラメーターにセキュリティサービスの品質情報を含めることもできます。 詳細については、「 偽装レベル」を参照してください。 呼び出し元のアプリケーションで SECURITY_SQOS_PRESENT フラグを指定する場合、 dwFlags パラメーターには次の 1 つ以上の値を含めることができます。

説明
SECURITY_ANONYMOUS
匿名偽装レベルでクライアントを偽装します。
SECURITY_CONTEXT_TRACKING
セキュリティ追跡モードは動的です。 このフラグが指定されていない場合、セキュリティ追跡モードは静的です。
SECURITY_DELEGATION
委任の偽装レベルでクライアントを偽装します。
SECURITY_EFFECTIVE_ONLY
サーバーで使用できるのは、クライアント セキュリティ コンテキストの有効な側面のみです。 このフラグを指定しない場合は、クライアント セキュリティ コンテキストのすべての側面を使用できます。

これにより、クライアントは、クライアントの偽装中にサーバーが使用できるグループと特権を制限できます。

SECURITY_IDENTIFICATION
Id 偽装レベルでクライアントを偽装します。
SECURITY_IMPERSONATION
偽装偽装レベルでクライアントを偽装します。

戻り値

関数が成功した場合、戻り値は指定されたファイルへの開いているハンドルです。

失敗した場合の戻り値は、INVALID_HANDLE_VALUE です。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

dwFlags パラメーターには、ファイル属性フラグ (FILE_ATTRIBUTE_*) を含めることはできません。 これらは、ファイルの作成時にのみ指定できます。

Windows 8 と Windows Server 2012 では、この関数は、次のテクノロジによってサポートされています。

テクノロジ サポートされています
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 Transparent Failover (TFO) はい
スケールアウト ファイル共有 (SO) を使う SMB 3.0 はい
クラスターの共有ボリューム ファイル システム (CsvFS) はい
Resilient File System (ReFS) はい

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー winbase.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CreateFile

File Management 関数