Повреждение данных в двоичных файлах из-за принудительного выключения компьютера

Повреждение данных в двоичных файлах из-за принудительного выключения компьютера

Я сохранил некоторые данные в двоичном файле с помощью C++. Через две минуты после сохранения данных питание компьютера внезапно отключилось. Когда я перезагрузил компьютер, данные были повреждены. Когда я прочитал двоичный файл, все значения были 0, что, конечно, не то, что я записал в файл.

Возможно ли, что внезапное отключение питания компьютера повредило данные в моих файлах? Или это так, что этого не может быть, потому что данные, однажды записанные и сохраненные на диск, не повреждаются даже в случае внезапного отключения питания.? Если это последнее, то мне придется начать детальное расследование проблемы, но я действительно не подозреваю, что что-то еще могло пойти не так. Программа очень проста и используется уже 2 года, и это первый раз, когда я вижу какое-либо повреждение данных файлов, записанных с помощью программы.

PS Файл действительно был сохранен. Программа, которая сохранила файл, правильно управляет файловым вводом/выводом - она ​​закрывает файл после завершения записи. Кроме того, программа даже не была запущена, когда произошло отключение питания. Это произошло на Windows 8.1.

решение1

Проще говоря, когда вы создаете файл данных, операционная система должна выполнить следующие три действия:

  1. Выделите блоки, необходимые для хранения данных.
  2. Запишите нули в эти блоки или иным образом вызовите отображение нулей при попытке их чтения.
  3. Запишите свои данные в выделенные блоки.

Шаг 2 является обязательным из-за безопасности системы. Выделенные блоки могли ранее содержать чьи-то данные, и для системы было бы нарушением безопасности позволить вам прочитать их старые данные. Поэтому вместо этого вы получите нули. Если бы питание было отключено между шагами 2 и 3, вы бы увидели нули вместо своих данных.

В зависимости от базовой операционной системы и файловой системы, если вы явно не синхронизируете данные с диском в своей программе, шаг 3 может произойти через сколь угодно долгое время после шага 2.

В системах, совместимых с POSIX, вызовитеfsync()чтобы гарантировать, что ваши данные находятся на постоянном хранении.

Связанный контент