17 if (shouldRemoveTempFile)
21 Q_ASSERT(status != Status::ShouldWrite);
22 status = Status::ShouldWrite;
28 const int maxAttempts = 20;
29 for (; i < maxAttempts; ++i) {
30 tempFile.setFileName(targetFile
31 + QString::number(QRandomGenerator::global()->generate(), 16).mid(0, 8)
32 + QStringLiteral(u".tmp"));
33 if (tempFile.open(QIODevice::ReadWrite | QIODevice::NewOnly))
36 if (i == maxAttempts) {
37 warnings.append(tr(
"Could not create temp file for %1").arg(targetFile));
38 status = FileWriter::Status::SkippedDueToFailure;
43 QTextStream inF(&tempFile);
46 auto cleanup = qScopeGuard([
this, &inF, &success, nBk] {
51 if (QFile::exists(targetFile)) {
53 if (tempFile.open(QIODevice::ReadOnly)) {
54 auto closeTmpF = qScopeGuard([
this] { tempFile.close(); });
55 QFile oldF(targetFile);
56 if (oldF.open(QIODevice::ReadOnly)) {
58 while (!tempFile.atEnd() && !oldF.atEnd()) {
59 QByteArray l1 = tempFile.readLine();
60 QByteArray l2 = oldF.readLine();
64 if (tempFile.atEnd() && oldF.atEnd() && same) {
66 shouldRemoveTempFile =
false;
67 status = Status::SkippedEqual;
75 const int maxAttempts = 10;
76 for (; i < maxAttempts; ++i) {
77 if (QFile::exists(targetFile)) {
81 QFile::remove(targetFile);
82 }
else if (nBk == 1) {
83 QString bkFileName = targetFile + QStringLiteral(u"~");
84 QFile::remove(bkFileName);
85 QFile::rename(targetFile, bkFileName);
91 QString bkFileName = targetFile + QStringLiteral(u"~");
93 if (QFile::exists(bkFileName))
94 bkFileName = targetFile + QString::number(iBk)
95 + QStringLiteral(u"~");
98 QFile::remove(targetFile + QStringLiteral(u"1~"));
100 QFile::remove(targetFile + QString::number(++iBk)
101 + QStringLiteral(u"~"));
102 QFile::remove(bkFileName);
103 QFile::rename(targetFile, bkFileName);
105 if (!bkFileName.isEmpty() && QFile::rename(targetFile, bkFileName))
106 newBkFiles.append(bkFileName);
108 if (tempFile.rename(targetFile)) {
109 status = Status::DidWrite;
110 shouldRemoveTempFile =
false;
115 tr(
"Rename of file %1 to %2 failed").arg(tempFile.fileName(), targetFile));
116 status = Status::SkippedDueToFailure;
118 warnings.append(tr(
"Error while writing"));
121 success = write(inF);
125 warnings.append(tr(
"Exception trying to write file %1").arg(targetFile));
126 status = FileWriter::Status::SkippedDueToFailure;
128 if (status == Status::ShouldWrite)
129 status = Status::SkippedDueToFailure;