2016-05-26 5 views
0

ファイルを開いたままにして数時間かけてデータを書き込むWin32プログラムがあります。エクスプローラウィンドウに表示されているように、ファイルサイズが頻繁に更新されるようにしたいと思います。ファイルを書き込んだままでファイルサイズを更新するWin32プログラムを取得する方法

例として、ブラウザが大きなファイルをダウンロードしているときに、ファイルがまだダウンロード中であっても、時間の経過と共にファイルサイズの変化を見ることができます。

現在のナイーブな実装では、ファイルを閉じるまでファイルサイズはゼロのままです。

これはどのようにしてWin32で行いますか?現在ファイルはstd::ofstreamを使用して開いています。これはstd::ostream::flush()の適切なアプリケーションですか?または、ファイルを閉じて再オープンする必要がありますか?

+3

https://blogs.msdn.microsoft.com/oldnewthing/20111226-00/?p=8813 –

答えて

1

std::ostream::flush()あなたのデータはディスクに保存されていることを確認してください。バッファをフラッシュすることは、自動フラッシュでは不十分な状況で有効な使用例です(たとえば、あまりにも長時間書き込まれたデータが少なすぎると、データは絶えず書き込まれますが、常にアクセス可能である必要があります。データがクラッシュまたはパワーダウンなどの場合に記録されることを確認してください)。しかし、一部のOS /ファイルシステムの組み合わせ(Why is the file size reported incorrectly for files that are still being written to?を参照)では、それでもファイルサイズはそれに応じて更新されません。 Win32では、実際にハンドルを閉じる/再オープンする前に、サイズの更新は表示されません。時にはディレクトリなどを再読することが助けになることもありますが、時にはそれは単純にはできません。

このように、たとえばReOpenFileを強制的に更新するか、フラッシュする代わりにclose/openを使用するだけです。正確な解決方法は、であるかどうかによって更新されるファイルサイズが非常に劇的に小さく、出力レートの低下が実際の問題ではない場合(再オープンが最適なオプションです)、間違ったサイズで報告することができますあなたの最高のオプションIMOです)。

+0

ありがとうございました。エクスプローラウィンドウを更新するためにF5キーを押すだけでした。私はflush()と再オープントリックを試しましたが、それらは何も傷つけませんでしたが、私は手動でExplorerをリフレッシュする必要がありました。 – Sonicsmooth

関連する問題