2

私のコードはこれに近いです:

  1. 次のような通常の C++ IO ストリーム挿入を使用した多数の書き込みsteram << "foo";
  2. stream.flush();ある時点で;
  3. _stat()上記のフラッシュの直後の MSVC C API の呼び出し。

私が観察しているのは、呼び出しが、より小さいサイズ_stat()とは異なるサイズを返していることです。stream.tellp()

stream関数を呼び出す前に閉じると、_stat()正しい結果が返されます。に足を踏み入れ、サイズを取得するため_stat()に使用します。FindFirstFileEx()

これは既知の Win32 API の癖ですか?

4

3 に答える 3

2

WindowsVista以降で作業していると思います。ファイルがディスクにフラッシュされるたびに、XPのファイル属性でファイルサイズが更新されました。これはVistaではもはや当てはまりません。Hansはすでにファイル属性にコメントを付けており、ファイルの最後のハンドルが閉じられるとそのサイズが更新されます。

詳細については、OldNewThingブログを参照してください。

ファイルをもう一度開いて閉じることもできます。

于 2012-06-24T09:40:03.877 に答える
1

GetFileInformationByHandleを使用して、正確なサイズを取得します。

于 2012-06-24T09:19:50.947 に答える
0

これは、ファイル システムのキャッシュが原因である可能性があります。C++ ストリームの観点から見ると、標準で要求されているように、書き込まれたすべてのデータが物理デバイスに渡されています。ただし、ファイル システムは書き込みをキャッシュし、他のポリシーに従ってフラッシュする場合があります。

考えられる解決策は、次の Win32 API オプションのいずれかを使用することです。

  1. CreateFileを使用してファイルを自分で開いた場合は、FILE_FLAG_NO_BUFFERINGおよびFILE_FLAG_WRITE_THROUGHフラグを使用します。
  2. 書き込みが完了したら、FlushFileBuffersを呼び出して、メタデータが確実にフラッシュされるようにします (そのためには、何らかの方法でファイルのハンドルを取得する必要があります)。

C++ ストリームが独自のバッファリングを行っていると仮定すると、これによってパフォーマンスが大幅に低下することはありません。

于 2012-06-22T12:00:50.480 に答える