6

Windows XP および Vista でディスクのポリシーがハード ディスクの書き込みキャッシュを有効にするように設定されている場合、書き込まれたばかりのファイルをフラッシュし、ディスクにコミットされていることを確認する方法はありますか?

これを C++ でプログラム的に実行したいと考えています。

ファイルを閉じると、アプリケーション レベルでフラッシュが実行されますが、オペレーティング システム レベルでは実行されません。ファイルを閉じた後、オペレーティング システムがディスク書き込みキャッシュをフラッシュする前に PC の電源が切られた場合、ファイルは閉じられていても失われます。

4

6 に答える 6

8

.NET FileStream.Flush() は、そのファイル コンテンツの Windows キャッシュをフラッシュしません。Flush() は、.NET 内部ファイル バッファのみをフラッシュします。.NET 4.0 では、Microsoft はオプションのパラメーターを Flush() に追加することで問題を修正しました。このパラメーターを true に設定すると、FlushFileSystemBuffers が呼び出されます。.NET 3.5 以下では、唯一の選択肢は pinvoke を介して FlushFileBuffers を呼び出すことです。これを行う方法については、 MSDN のFileStream.Flushコミュニティ コメントを参照してください。

于 2011-07-18T22:22:25.197 に答える
4

ファイルを閉じるときにこれを修正しないでください。FILE_FLAG_WRITE_THROUGHCreateFile()に渡されるファイルを開かない限り、Windowsはキャッシュします。

合格することもできFILE_FLAG_NO_BUFFERINGます; これは、バイトのコピーをキャッシュに保持しないようにWindowsに指示します。

MSDNのCreateFileドキュメントによると、これはFlushFileBuffers()よりも効率的です。

MSDNのファイルバッファリングファイルキャッシュも参照してください。

于 2009-05-06T15:37:33.063 に答える
2

フレームワークAPIのflushメソッドを呼び出した場合でも、データが実際のディスクにフラッシュされない可能性があることにも注意してください。

flushメソッドを呼び出すと、カーネルはそのページをディスクにフラッシュするように指示されるだけです。ただし、ディスク書き込みキャッシュをオンにしている場合は、実際の書き込みプロセスを無期限に遅らせることができます。

データが物理層に確実に書き込まれるようにするには、オペレーティングシステムの書き込みキャッシュをオフにする必要があります。多くの小さなio操作を処理する場合、これにはほとんどの場合、最大1桁または2桁のパフォーマンスの低下が伴います。バッテリベースのサポート(UPS)またはディスク書き込みキャッシュをフラッシュするコマンドを受け入れるディスクは、この問題に対処するためのもう1つのオプションです。

于 2009-05-06T14:58:23.577 に答える
2

開発環境を指定していないため、次のようになります。

。ネット

IO ストリームには、必要なことを行う.Flushメソッドがあります。

Win32 API

FlushFileBuffersファイルハンドルを引数として取る呼び出しがあります。

編集 (OA からのコメントに基づく): FlushFileBuffers は管理者権限を必要としません。渡されたハンドルがボリュームのハンドルであり、単一のファイルのハンドルではない場合にのみ実行されます。

于 2008-10-06T08:43:57.020 に答える
1

マイクロソフトのドキュメントから、_flushallを使用し、 COMMODE.OBJでリンクして、すべてのバッファーがディスクにコミットされていることを確認します。

于 2008-10-06T10:29:59.553 に答える