情報: せずに FILE_FLAG_WRITE_THROUGH と FILE_FLAG_NO_BUFFERING

概要

CreateFile() にせずに FILE_FLAG_WRITE_THROUGH フラグには、バッファリングされることがなくファイルに直接書き込まれる、そのハンドルに加えられたすべての書き込みが発生します。データがキャッシュされる場合は、(ディスク キャッシュに格納されます)。ただし、ファイルに直接書き込むことができます。(である場合もあります)、キャッシュされたデータの読み取り要求を満たすためにそのデータの読み取り操作により、このメソッドではなく、ファイルの操作を行いますを参照してデータを取得します。書き込みの呼び出しは、データがファイルに書き込まれるまでを返しません。リモートへの書き込みも--を適用せずに FILE_FLAG_WRITE_THROUGH フラグを設定、サーバーにデータがファイルに書き込まれるまで、書き込み要求を満たすためにサーバーが認識できるようにネットワーク リダイレクターのパスです。


FILE_FLAG_NO_BUFFERING はさらにこの概念の 1 つのステップと、ファイルから、任意のシステム バッファーまたはディスク キャッシュからではなくにすべての読み取りを保証するため、すべて先読みファイルのバッファリングとディスクが同様に、キャッシュを排除します。FILE_FLAG_NO_BUFFERING を使用して、ディスクの読み込みおよびセクターの境界上の書き込みを行う必要がありますバッファーのアドレスは、メモリ内のディスク セクターの境界に配置する必要があります。


読み取りに渡すか、API を記述するバッファーは、デバイス ・ レベルで I/O を直接使用するため、これらの制限が必要そのレベルでは、バッファーのアドレス、セクターのサイズは、プロセッサとメディア配置で実行しているハードウェアの制限を満たす必要があります。

詳細

Windows 95 の CDFS (CD-ROM ファイル システム) は、CreateFile() の FILE_FLAG_NO_BUFFERING フラグをサポートしていません。VFAT など、Windows 95 の FSD を実装することがあります FILE_FLAG_NO_BUFFERING は、ファイル システム ドライバーは、必要なフラグではない場合、CDFS でサポートされていないときにします。


次のコードは、バッファー内のデータのセクターに配置し、CreateFile() に渡す方法を示しています。

  char buf[2 * SECTOR_SIZE - 1], *p;
p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));
h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);


ポインター p セクター揃えは、バッファー内のポイントです。


現在の論理ドライブ上の開いているすべてのファイルをフラッシュする状況があれば、これ実行できます。

   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);

このメソッドは、c: パーティションをフラッシュし、ディスクに書き込まれるすべての開いているファイルのすべてのバッファーされた書き込みデータです。バッファリングのシステム以外では、影響を受けないことこのフラッシュは注意してください。バッファリングの C ランタイム ルーチンで開かれたファイルに C ランタイムを実行することの可能なファイルには影響しません。


ネットワーク経由でリモート ファイルを開くとき、サーバーは常にキャッシュし、クライアントによって指定されていないバッファリングのフラグを無視します。これは仕様です。リダイレクターおよびサーバーでは、ネットワーク経由でフル FILE_FLAG_NO_BUFFERING のセマンティクスを実装することことはできません正しく。具体的には、セクター サイズ、セクターでアラインメントされた I/O の要件を満たすことはできません。そのため、Win32 ベースのアプリケーションでは、FILE_FLAG_NO_BUFFERING のメッセージが表示されたら、リダイレクターおよびサーバーとして処理を要求せずに FILE_FLAG_WRITE_THROUGH の。ファイルがクライアントでキャッシュされていない、書き込み、サーバー上のサーバーとディスクに直接の移動し、ネットワーク上の読み取り/書き込みサイズを要求するアプリケーションには。ただし、ファイルは、サーバーにキャッシュされます。


クライアントにキャッシュしないと、I/O の種類に応じて、別の効果を持つことができます。可能性がありますサイズを小さくのですが、キャッシュ ・ ヒットを排除するか、先読み、送受信を実行します。一般に、シーケンシャル I/O は、それはクライアント側でキャッシュするとよいでしょうです。アクセスのため、小規模のランダムな I/O、一般的にはキャッシュされないようにします。
プロパティ

文書番号:99794 - 最終更新日: 2017/01/12 - リビジョン: 1

フィードバック