Можно ли проверить, действительно ли все байты записываются в QFile или нет? На данный момент это все что у меня есть
QFile f(name);
if (f.open(QIODevice::WriteOnly)){
f.write(bytes);
}
bytes
имеет размер 1 МБ, и бывают случаи, когда весь кусок не записывается в файл, поэтому я получаю поврежденный файл.
То, что вы ищете, это контрольная сумма с помощью которого вы можете проверить целостность ваших данных. То, что вы хотите сделать здесь, это использовать qChecksum как это:
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.";
}
}
Я не скомпилировал код, но он должен работать. Если это не так, я буду более конкретным с примером.
В 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();
}
Если вы беспокоитесь о повреждении записываемых файлов, возможно, QSaveFile было бы лучше использовать класс вместо QFile.
Как указано в документации:
QSaveFile — это устройство ввода-вывода для записи текстовых и двоичных файлов без потери существующих данных в случае сбоя операции записи.
к обеспечивать что все байты записаны должным образом в файл, вы должны поддерживать дайджест (контрольную сумму) всех байтов, записанных в файл. Сравните результат результата текущей контрольной суммы с результатом контрольной суммы, выполненной над файлом.
Пожалуйста, изучите SHA-1 (алгоритм безопасного хэширования), MD5 и «Хэш-функции». Также «алгоритм целостности данных c ++».
QFile :: flush или QFile :: close должны вызывать запись всего буферизованного содержимого. Важно проверить возвращаемые значения всех вызовов QFile.