Убедитесь, что все байты правильно записаны в файл

Можно ли проверить, действительно ли все байты записываются в QFile или нет? На данный момент это все что у меня есть

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

bytes имеет размер 1 МБ, и бывают случаи, когда весь кусок не записывается в файл, поэтому я получаю поврежденный файл.

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.";
}
}

Я не скомпилировал код, но он должен работать. Если это не так, я буду более конкретным с примером.

2

Другие решения

В Qt 5 вы действительно должны использовать QSaveFile. Это обеспечивает два очень важных инварианта:

  1. частичные / неудачные записи не повреждают существующий файл,

  2. файл сбрасывается ко времени 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();
}
7

Если вы беспокоитесь о повреждении записываемых файлов, возможно, QSaveFile было бы лучше использовать класс вместо QFile.

Как указано в документации:

QSaveFile — это устройство ввода-вывода для записи текстовых и двоичных файлов без потери существующих данных в случае сбоя операции записи.

4

к обеспечивать что все байты записаны должным образом в файл, вы должны поддерживать дайджест (контрольную сумму) всех байтов, записанных в файл. Сравните результат результата текущей контрольной суммы с результатом контрольной суммы, выполненной над файлом.

Пожалуйста, изучите SHA-1 (алгоритм безопасного хэширования), MD5 и «Хэш-функции». Также «алгоритм целостности данных c ++».

2

QFile :: flush или QFile :: close должны вызывать запись всего буферизованного содержимого. Важно проверить возвращаемые значения всех вызовов QFile.

1
По вопросам рекламы [email protected]