[SDK32] FILE_FLAG_WRITE_THROUGH と FILE_FLAG_NO_BUFFERING この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。
この記事は、以前は次の ID で公開されていました: JP410193 この資料は、米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 99794 (http://support.microsoft.com/kb/99794/EN-US/) (最終更新日 1996-08-08) をもとに作成したものです。 概要
CreateFile() に FILE_FLAG_WRITE_THROUGH フラグを指定した場合、該当のハンドルを
持つファイルに対しては、バッファリングなしで直接書き込まれます。データはキャッ
シュされます (ディスク キャッシュに保存されます) が、ファイルに直接書き込まれま
す。このメソッドでは、データがまだキャッシュに残っていれば、ファイルから読み込
むのではなく、キャッシュから読み込めます。書き込み呼び出しは、ファイルにデータ
を書き込むまで呼び出し元に戻りません。これは、リモート 書き込みでも同様です。ネ
ットワーク リダイレクタはサーバーに FILE_FLAG_WRITE_THROUGH フラグを渡し、サー
バーはファイルにデータが書き込まれるまで書き込み要求に答えません。 この概念を更に進めたのが FILE_FLAG_NO_BUFFERING です。これは、読み込みに先立つ ファイルのバッファリングやディスク キャッシングを行いませんので、読み込まれたデ ータはシステム バッファやディスク キャッシュからではなくファイルからであること が保証されます。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 の場合は、キャッシュしない方が最善であることもあります。
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。" |
|


先頭へ戻る
