是否可以检查所有字节是否实际写入QFile?目前这就是我所有的
QFile f(name);
if (f.open(QIODevice::WriteOnly)){
f.write(bytes);
}
bytes
的大小为1MB,有时整个块没有写入文件,因此我最终得到了一个损坏的文件。
答案 0 :(得分:7)
在Qt 5中,你真的应该使用QSaveFile
。它确保了两个非常重要的不变量:
部分/失败的写入不会破坏现有文件,
在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();
}
答案 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调用的返回值非常重要。