C++ を使用してバイナリ ファイルにデータを保存しました。データを保存してから 2 分後、コンピューターの電源が突然切れました。コンピューターを再起動すると、データが破損していました。バイナリ ファイルを読み込んだところ、すべての値が でしたが0
、これはファイルに書き込んだものとはまったく異なっていました。
突然のコンピュータの電源オフによってファイル内のデータが破損した可能性はありますか? それとも、一度ディスクに書き込まれて保存されたデータは突然の電源オフでも破損しないので、これはあり得ないことなのでしょうか? 後者の場合、問題の詳細な調査を開始する必要がありますが、他に何か問題があるとは思いません。プログラムは非常にシンプルで、2 年間使用していますが、プログラムを使用して書き込まれたファイルのデータ破損を目にしたのは今回が初めてです。
PS ファイルの保存は確かに完了していました。ファイルを保存したプログラムはファイル I/O を正しく管理しており、書き込みが完了したらファイルを閉じます。また、電源が落ちたときにはプログラムは実行されていませんでした。これは Windows 8.1 で発生しました。
答え1
簡単に言えば、データのファイルを作成するときに、オペレーティング システムは次の 3 つのことを行う必要があります。
- データを保存するために必要なブロックを割り当てます。
- これらのブロックにゼロを書き込むか、または読み取ろうとするとゼロが表示されるようにします。
- 割り当てられたブロックにデータを書き込みます。
ステップ 2 は、システム セキュリティ上の要件です。割り当てられたブロックには、以前に他のユーザーのデータが含まれていた可能性があり、古いデータを読み取ることを許可すると、システムのセキュリティ違反になります。そのため、代わりにゼロが表示されます。ステップ 2 と 3 の間で電源が切断された場合、データではなくゼロが表示されます。
基盤となるオペレーティング システムとファイル システムによっては、プログラム内でデータをディスクに明示的に同期しない限り、ステップ 3 はステップ 2 の任意の長い時間後に発生する可能性があります。
POSIX準拠のシステムでは、fsync()データが永久保存されたことを確認します。