Как написать файл, а затем прочитать его обратно, чтобы проверить его содержимое, убедившись, что вы получаете то, что находится на диске, а не в кеше - PullRequest
5 голосов
/ 10 января 2012

Я использую собственный код / ​​C ++ / Win32 / MFC в Windows для сохранения файла документа с помощью сериализации MFC. Я вставил свой собственный производный от CFile класс в процесс написания, предоставляя мне доступ к данным по мере их написания. Это позволяет мне вычислять контрольную сумму (или хэш и т. Д.) Для данных по мере их поступления в файл.

После сохранения файлов я бы хотел разрешить возможность проверки файла. Идея состоит в том, чтобы повторно открыть файл и прочитать его, проверяя контрольную сумму / хэш / и т. Д.

Мне интересно, однако, возможно ли, что после того, как я только что написал файл, ОС могла выдавать мне неписанные данные, когда я сразу же читаю файл обратно. В этом случае тест на самом деле не говорит мне, что файл хорошо выглядит на диске.

Является ли мое беспокойство действительным? Если да, то есть ли способ избежать этой проблемы?

Ответы [ 3 ]

5 голосов
/ 10 января 2012

Если вы используете CFile , вы можете позвонить CFile :: Flush , чтобы убедиться, что все записано на диск. Согласно документации

virtual void Flush( );

Принудительно записывает в файл любые данные, оставшиеся в буфере файла.

3 голосов
/ 11 января 2012

Если вы действительно хотите это сделать, то вы можете избежать кэширования и буферизации диска, указав FILE_FLAG_NO_BUFFERING и / или FILE_FLAG_WRITE_THROUGH при открытии файла. Помните, что использование этих параметров усложнит ситуацию.

Файл или устройство открываются без системного кэширования для чтения и записи данных. Этот флаг не влияет на кеширование жесткого диска или отображение файлов в памяти. Существуют строгие требования для успешной работы с файлами, открытыми с помощью CreateFile с использованием флага FILE_FLAG_NO_BUFFERING , подробнее см. Буферизация файлов .

Более простой альтернативой является вызов FlushFileBuffers непосредственно перед закрытием дескриптора файла.

1 голос
/ 10 января 2012

Я не знаю ответа на этот вопрос.Однако я знаю, где искать.

SQLite гарантирует, что данные будут безопасно записаны на диск, независимо от того, что произойдет, даже при сбое питания.Они должны делать то, что вам нужно, их код с открытым исходным кодом и красиво прокомментирован.

Все изменения в пределах одной транзакции в SQLite происходят полностью или не происходят вообще, даже если процесс записи изменения на диск прерывается

сбоем программы,

сбой операционной системы,

или сбой питания.

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

http://sqlite.org/transactional.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...