c++ - 确保所有字节都正确写入文件

标签 c++ qt read-write qfile

是否有可能检查是否所有字节实际上都写入了 QFile?目前这就是我所有的

QFile f(name);
if (f.open(QIODevice::WriteOnly)){
     f.write(bytes);
}

bytes 的大小为 1MB,有时整个 block 没有写入文件,因此我最终得到一个损坏的文件。

最佳答案

在 Qt 5 中你真的应该使用 QSaveFile .它确保了两个非常重要的不变量:

  1. 部分/失败的写入不会损坏现有文件,

  2. 文件在 QSaveFile 实例被销毁时刷新。

因为这是一个正确的 C++ 类,实现了 RAII,除了必须调用 commit() 之外,您不需要做任何特殊的事情来确保它工作。 commit() 的含义是:您表明您不会向该文件写入任何更多数据。此时,实现可以自由关闭文件,将其刷新到磁盘,并用新文件替换旧文件。

/// When this function returns true, you can be certain that the file contains exactly "foo bar".
bool writeFooBar() {
  QSaveFile file(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
  if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    return false;
  if (-1 == file.write("foo bar"))
    return false;
  return file.commit();
}

关于c++ - 确保所有字节都正确写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26244030/

相关文章:

C++:检索映射值并插入到第二个映射中

c++ - 在 Linux 上使用 Qt 5.4 的某些 OpenGL 函数...

c++ - 'objects' 的 Qt 所有权(T* 和 const T*)

java - cassandra 应该用在先读后写场景吗?

c# - 在注册表中保存文本框值

c++ - 获取调用堆栈的大小

c++ - opengl 4 中的逐顶点光照问题

c++ - 图像旋转,伪造图像直方图

c++ - 在 Qt 事件中中断

android - 如何将音频文件复制到另一个文件