如何写入文件,然后将其读回以验证其内容,确保您获得的是磁盘上的内容而不是缓存

How to write a file then read it back to verify its contents, ensuring you're getting what's on the disk not the cache

本文关键字:何写入 文件 磁盘 缓存 然后 验证 确保      更新时间:2023-10-16

我在Windows上使用本机/C++/W32/MFC代码通过MFC序列化保存文档文件。我在编写过程中插入了自己的CFile派生类,使我可以在编写数据时访问数据。这允许我在数据输出到文件时计算数据的校验和(或散列等)。

保存文件后,我希望允许选择验证文件。这个想法是重新打开文件并读取它,验证校验和/哈希等。

不过,我想知道,在刚写完文件后,当我马上读回文件时,操作系统是否会给我未写的数据。在这种情况下,测试并没有真正告诉我文件在磁盘上看起来不错。

我的担忧有效吗?如果是,有什么办法可以避免这个问题吗?

如果您使用CFile,您可以调用CFile::Flush以确保所有内容都写入磁盘。根据文件

virtual void Flush( );

强制将文件缓冲区中剩余的任何数据写入文件

如果您真的想这样做,那么在打开文件时可以通过指定FILE_FLAG_NO_BUFFERING和/或FILE_FLAG_WRITE_THROUGH来避免磁盘缓存和缓冲。请注意,使用这些选项会使事情复杂化。

打开文件或设备时没有用于数据读写的系统缓存。此标志不影响硬盘缓存或内存映射文件。使用FILE_FLAG_NO_BUFFERING标志成功处理用CreateFile打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。

一个更简单的替代方法是在关闭文件句柄之前调用FlushFileBuffers

我不知道这个问题的答案。不过,我知道该去哪里找。

SQLite保证数据安全地写入磁盘,无论发生什么情况,甚至是电源故障。他们一定在做你需要的事情,他们的代码是开源的,并且有很好的注释。

SQLite中单个事务中的所有更改要么发生完全或根本没有,即使将更改写入光盘被中断

程序崩溃

操作系统崩溃

或电源故障。

上一段的声明在SQLite中得到了广泛的检查回归测试套件,使用模拟操作系统崩溃和电源对数据库文件的影响故障。

http://sqlite.org/transactional.html