如何写入文件,然后将其读回以验证其内容,确保您获得的是磁盘上的内容而不是缓存
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
我在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
- 用C++将哈希表写入文件并从文件中恢复
- 写入文件会产生一个空文件或根本没有文件
- 在 C++ 中使用指针将对象写入文件
- 使 std::fstream 写入文件末尾,但从头开始读取
- 写入文件 a.txt,而终端重定向到文件 b.txt
- C++无法写入文件
- G++编译器:无法写入文件
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 如何在写入文件时擦除最后一个逗号
- 在 c++ 中写入文件
- 从缓冲区读取/写入文件
- 将 cpprestsdk json 值对象写入文件
- 如何将 id 写入文件,然后将其读回?
- 如何重载 << 运算符,以便将对象的数据写入文件?
- 有没有办法将字符串写入文件?
- 如何使用单个fstream创建、读取和写入文件
- 如何使用字符串::replace方法写入文件
- 在头c++中写入文件
- 为什么使用 C++ 中的类对象写入文件中的数据以非文本格式存储?
- 在 c++ 中读取/写入文件