2

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

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

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

1 ответ1

2

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .