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

时间:2014-10-07 19:47:33

标签: c++ qt read-write qfile

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

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

  3. 由于这是一个适当的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();
    }
    

答案 1 :(得分:4)

如果您担心写入的文件已损坏,那么QSaveFile可能是更好的类,而不是QFile。

正如文件所述: -

  

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

答案 2 :(得分:2)

确保所有字节都正确写入文件,您应该保留写入文件的所有字节的摘要(校验和)。将运行校验和的结果与对文件执行的校验和的结果进行比较。

请研究SHA-1(安全散列算法),MD5和"散列函数"。还有" c ++数据完整性算法"。

答案 3 :(得分:2)

您正在寻找的是checksum,您可以使用该qChecksum检查数据的完整性。你想在这里做的是使用这样的{{3}}:

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

quint16 fileCheckSum = qChecksum(bytes.data(), bytes.length());

if (f.open(QIODevice::ReadWrite)) {
    QByteArray writtenBytes = f.readAll();

    quint16 writtenBytesCheckSum = qChecksum(writtenBytes .data(), writtenBytes .length());

    if(fileCheckSum == writtenBytesCheckSum)
    {
        qDebug() << "File is valid.";
    }
    else
    {
        qDebug() << "File is corrupt.";
    }
}

我还没有编译代码,但它应该有效。如果它没有更具体的例子。

答案 4 :(得分:1)

QFile :: flush或QFile :: close应该导致写入所有缓冲的内容。检查所有QFile调用的返回值非常重要。