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

Bur*_*Dor 1 c++ qt read-write qfile

是否可以检查所有字节是否实际上都写在QFile上?目前这就是我的全部

QFile f(name);
if (f.open(QIODevice::WriteOnly)){
     f.write(bytes);
}
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 7

在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();
}
Run Code Online (Sandbox Code Playgroud)


The*_*ght 5

如果您担心写入损坏的文件,也许 QSaveFile会是一个更好的类,而不是 QFile。

正如文档所述: -

QSaveFile 是一种用于写入文本和二进制文件的 I/O 设备,如果写入操作失败,则不会丢失现有数据。