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

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?现在我只有这些了

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