新しいファイル ハンドルを作成して、そのハンドルへの書き込み操作がすぐにディスクに書き込まれるようにする必要があります。
追加情報: ハンドルは子プロセスの継承された STDOUT になるため、そのプロセスからの出力をすぐにディスクに書き込む必要があります。
ドキュメントを調べるCreateFile
と、FILE_FLAG_WRITE_THROUGH
フラグは私が必要としているものとまったく同じように見えました:
書き込み操作は中間キャッシュを経由せず、ディスクに直接送信されます。
非常に基本的なテスト プログラムを作成しましたが、うまくいきません。CreateFile でフラグを使用WriteFile(myHandle,...)
してから、長いループで使用し、約 15 秒で約 100 MB のデータを書き込みました。(私はいくつかのを追加しましたSleep()
)。
次に、エクスプローラーで「F5」を連続して押すことからなる専門的な監視環境をセットアップしました。結果: ファイルは 0kB のままで、テスト プログラムが終了する頃に 100MB にジャンプします。
次に試したのは、書き込みごとに手動でファイルをフラッシュすることでしたFlushFileBuffers(myHandle)
。これにより、観測されたファイル サイズが期待どおりに安定して増加します。
私の質問は、ファイルを手動でフラッシュせずにFILE_FLAG_WRITE_THROUGH
これを行うべきではなかったのでしょうか? 何か不足していますか?「実際の」プログラムでは、ファイルをフラッシュできません。これは、ファイルを使用している子プロセスを制御できないためです。
FILE_FLAG_NO_BUFFERING
同じ理由で使用できないというフラグもあります。ハンドルを使用しているプロセスを制御できないため、このフラグで必要な書き込みを手動で調整することはできません。
編集:ファイルのサイズがどのように変化するかを監視するための別のプロジェクトを作成しました。.NETFileSystemWatcher
クラスを使用します。また、書き込むデータも少なくなり、合計で約 100kB になります。
これが出力です。タイムスタンプの秒を確認してください。
「組み込みのバッファなし」バージョン:
25.11.2008 7:03:22 PM: 10230 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10200 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10190 bytes added.
...そして「強制(手動)フラッシュ」バージョン(FlushFileBuffers()
〜2.5秒ごとに呼び出されます):
25.11.2008 7:06:10 PM: 10230 bytes added.
25.11.2008 7:06:12 PM: 10230 bytes added.
25.11.2008 7:06:15 PM: 10230 bytes added.
25.11.2008 7:06:17 PM: 10230 bytes added.
25.11.2008 7:06:19 PM: 10230 bytes added.
25.11.2008 7:06:21 PM: 10230 bytes added.
25.11.2008 7:06:23 PM: 10230 bytes added.
25.11.2008 7:06:25 PM: 10230 bytes added.
25.11.2008 7:06:27 PM: 10230 bytes added.
25.11.2008 7:06:29 PM: 10230 bytes added.