コンピュータの強制シャットダウンによるバイナリファイルのデータ破損

コンピュータの強制シャットダウンによるバイナリファイルのデータ破損

C++ を使用してバイナリ ファイルにデータを保存しました。データを保存してから 2 分後、コンピューターの電源が突然切れました。コンピューターを再起動すると、データが破損していました。バイナリ ファイルを読み込んだところ、すべての値が でしたが0、これはファイルに書き込んだものとはまったく異なっていました。

突然のコンピュータの電源オフによってファイル内のデータが破損した可能性はありますか? それとも、一度ディスクに書き込まれて保存されたデータは突然の電源オフでも破損しないので、これはあり得ないことなのでしょうか? 後者の場合、問題の詳細な調査を開始する必要がありますが、他に何か問題があるとは思いません。プログラムは非常にシンプルで、2 年間使用していますが、プログラムを使用して書き込まれたファイルのデータ破損を目にしたのは今回が初めてです。

PS ファイルの保存は確かに完了していました。ファイルを保存したプログラムはファイル I/O を正しく管理しており、書き込みが完了したらファイルを閉じます。また、電源が落ちたときにはプログラムは実行されていませんでした。これは Windows 8.1 で発生しました。

答え1

簡単に言えば、データのファイルを作成するときに、オペレーティング システムは次の 3 つのことを行う必要があります。

  1. データを保存するために必要なブロックを割り当てます。
  2. これらのブロックにゼロを書き込むか、または読み取ろうとするとゼロが表示されるようにします。
  3. 割り当てられたブロックにデータを書き込みます。

ステップ 2 は、システム セキュリティ上の要件です。割り当てられたブロックには、以前に他のユーザーのデータが含まれていた可能性があり、古いデータを読み取ることを許可すると、システムのセキュリティ違反になります。そのため、代わりにゼロが表示されます。ステップ 2 と 3 の間で電源が切断された場合、データではなくゼロが表示されます。

基盤となるオペレーティング システムとファイル システムによっては、プログラム内でデータをディスクに明示的に同期しない限り、ステップ 3 はステップ 2 の任意の長い時間後に発生する可能性があります。

POSIX準拠のシステムでは、fsync()データが永久保存されたことを確認します。

関連情報