16 if (shouldRemoveTempFile)
20 Q_ASSERT(status != Status::ShouldWrite);
21 status = Status::ShouldWrite;
26 const int maxAttempts = 20;
27 for (; i < maxAttempts; ++i) {
28 tempFile.setFileName(targetFile
29 + QString::number(QRandomGenerator::global()->generate(), 16).mid(0, 8)
30 + QStringLiteral(u".tmp"));
31 if (tempFile.open(QIODevice::ReadWrite | QIODevice::NewOnly))
34 if (i == maxAttempts) {
35 warnings.append(tr(
"Could not create temp file for %1").arg(targetFile));
36 status = FileWriter::Status::SkippedDueToFailure;
41 QTextStream inF(&tempFile);
44 auto cleanup = qScopeGuard([
this, &inF, &success] {
49 if (QFile::exists(targetFile)) {
51 if (tempFile.open(QIODevice::ReadOnly)) {
52 auto closeTmpF = qScopeGuard([
this] { tempFile.close(); });
53 QFile oldF(targetFile);
54 if (oldF.open(QIODevice::ReadOnly)) {
56 while (!tempFile.atEnd() && !oldF.atEnd()) {
57 QByteArray l1 = tempFile.readLine();
58 QByteArray l2 = oldF.readLine();
62 if (tempFile.atEnd() && oldF.atEnd() && same) {
64 shouldRemoveTempFile =
false;
65 status = Status::SkippedEqual;
72 if (QFile::exists(targetFile))
73 QFile::remove(targetFile);
74 if (tempFile.rename(targetFile)) {
75 status = Status::DidWrite;
76 shouldRemoveTempFile =
false;
78 warnings.append(tr(
"Rename of file %1 to %2 failed")
79 .arg(tempFile.fileName(), targetFile));
80 status = Status::SkippedDueToFailure;
83 warnings.append(tr(
"Error while writing"));
90 warnings.append(tr(
"Exception trying to write file %1").arg(targetFile));
91 status = FileWriter::Status::SkippedDueToFailure;
93 if (status == Status::ShouldWrite)
94 status = Status::SkippedDueToFailure;