C++ 确保所有字节都正确写入文件
是否可以检查是否所有字节都实际写入QFile?现在我只有这些了C++ 确保所有字节都正确写入文件,c++,qt,read-write,qfile,C++,Qt,Read Write,Qfile,是否可以检查是否所有字节都实际写入QFile?现在我只有这些了 QFile f(name); if (f.open(QIODevice::WriteOnly)){ f.write(bytes); } bytes的大小为1MB,并且有时整个块未写入文件,因此我最终会得到一个损坏的文件。QFile::flush或QFile::close会导致写入所有缓冲内容。检查所有QFile调用的返回值很重要。QFile::flush或QFile::close应导致写入所有缓冲内容。检查所有QFile
QFile f(name);
if (f.open(QIODevice::WriteOnly)){
f.write(bytes);
}
bytes
的大小为1MB,并且有时整个块未写入文件,因此我最终会得到一个损坏的文件。QFile::flush或QFile::close会导致写入所有缓冲内容。检查所有QFile调用的返回值很重要。QFile::flush或QFile::close应导致写入所有缓冲内容。检查所有QFile调用的返回值很重要。为了确保所有字节都正确写入文件,您应该维护写入文件的所有字节的摘要(校验和)。将运行校验和的结果与对文件执行的校验和的结果进行比较
请研究SHA-1(安全哈希算法)、MD5和“哈希函数”。还有“c++数据完整性算法”。为了确保所有字节都正确写入文件,您应该维护写入文件的所有字节的摘要(校验和)。将运行校验和的结果与对文件执行的校验和的结果进行比较
请研究SHA-1(安全哈希算法)、MD5和“哈希函数”。另外还有“c++数据完整性算法”。您正在寻找的是一种可以检查数据完整性的算法。您在这里要做的是这样使用:
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.";
}
}
QFile f(名称);
if(f.open(QIODevice::ReadWrite)){
f、 写入(字节);
}
quint16 fileCheckSum=qChecksum(bytes.data(),bytes.length());
if(f.open(QIODevice::ReadWrite)){
QByteArray writenbytes=f.readAll();
quint16 writtenBytesCheckSum=qChecksum(writtenBytes.data(),writtenBytes.length());
if(fileCheckSum==writenbyteschecksum)
{
qDebug()您正在寻找的是一个可以用来检查数据完整性的数据库。您在这里要做的是这样使用:
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.";
}
}
QFile f(名称);
if(f.open(QIODevice::ReadWrite)){
f、 写入(字节);
}
quint16 fileCheckSum=qChecksum(bytes.data(),bytes.length());
if(f.open(QIODevice::ReadWrite)){
QByteArray writenbytes=f.readAll();
quint16 writtenBytesCheckSum=qChecksum(writtenBytes.data(),writtenBytes.length());
if(fileCheckSum==writenbyteschecksum)
{
qDebug()如果您担心编写损坏的文件,那么使用qDebug()类可能比使用QFile类更好
如文件所述:-
QSaveFile是一种I/O设备,用于写入文本和二进制文件,在写入操作失败时不会丢失现有数据
如果您担心编写损坏的文件,那么使用QFile类可能比使用QFile类更好
如文件所述:-
QSaveFile是一种I/O设备,用于写入文本和二进制文件,在写入操作失败时不会丢失现有数据
在Qt 5中,您确实应该使用。它确保了两个非常重要的不变量:
部分/失败写入不会损坏现有文件
在销毁QSaveFile
实例时,将刷新该文件
因为这是一个适当的C++类,实现RAII,你不需要做任何特殊的事情来保证它是有效的,除了必须调用<代码>()(< /代码>)。
is:表示将不再向该文件写入任何数据。此时,实现可以自由关闭该文件,将其刷新到磁盘,并用新文件替换旧文件
/// 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();
}
在Qt 5中,您确实应该使用。它确保了两个非常重要的不变量:
部分/失败写入不会损坏现有文件
在销毁QSaveFile
实例时,将刷新该文件
因为这是一个适当的C++类,实现RAII,你不需要做任何特殊的事情来保证它是有效的,除了必须调用<代码>()(< /代码>)。
is:表示将不再向该文件写入任何数据。此时,实现可以自由关闭该文件,将其刷新到磁盘,并用新文件替换旧文件
/// 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();
}
在我的应用程序中,我正在写入多个
字节,每个字节为1MB。比如说,在添加10MB数据后,如果我这样做f.flush()
我知道某个块是不完整的?但我能确定具体是哪个块吗?如果较低级别的系统调用失败,write、flush或close将返回false。例如,如果没有更多的磁盘空间。如果您不相信这一点,可能是因为另一个进程或线程正在您的文件上涂鸦,您可以关闭以只读方式打开该文件,并与字节进行比较。如果该文件在该测试后损坏,该怎么办?在某些情况下,您必须信任返回值。在我的应用程序中,我正在写入多个字节,每个字节为1MB。假设在添加10 MB数据后,如果我执行f.flush()
我知道某个块是不完整的?但我能确定具体是哪个块吗?如果较低级别的系统调用失败,write、flush或close将返回false。例如,如果没有更多的磁盘空间。如果您不相信这一点,可能是因为另一个进程或线程正在您的文件上涂鸦,您可以关闭e文件,以只读方式打开并与字节进行比较。如果该文件在测试后损坏怎么办?在某个点上,您必须信任返回值。这可能对OP有帮助。Qt已经有一些md5和其他的类:感谢@Chernobyl的链接。我现在得到了每个字节的SHA1。我只是不太熟悉@ThomasMatthews正在谈论的过程。我想我需要进一步研究并回到它。也许它对OP有帮助。Qt已经有一些md5和其他的课程:感谢链接@Chernobyl。我正在为每一个获得SHA1