app: save library.json atomically

This commit is contained in:
Marco Allegretti 2026-02-13 13:06:19 +01:00
parent 05ca3de5f5
commit c6f3e645f4

View file

@ -18,6 +18,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonParseError> #include <QJsonParseError>
#include <QSaveFile>
#include <QStandardPaths> #include <QStandardPaths>
#include <QtConcurrent> #include <QtConcurrent>
@ -936,10 +937,14 @@ void App::saveLibrary()
QString dataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QString dataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QDir dir(dataPath); QDir dir(dataPath);
if (!dir.exists()) { if (!dir.exists()) {
dir.mkpath(dataPath); if (!dir.mkpath(dataPath)) {
qWarning() << "Failed to create data directory:" << dataPath;
return;
}
} }
QFile file(dataPath + QStringLiteral("/library.json")); const QString libraryPath = dataPath + QStringLiteral("/library.json");
QSaveFile file(libraryPath);
if (!file.open(QIODevice::WriteOnly)) { if (!file.open(QIODevice::WriteOnly)) {
qWarning() << "Failed to save library:" << file.errorString(); qWarning() << "Failed to save library:" << file.errorString();
return; return;
@ -954,7 +959,16 @@ void App::saveLibrary()
} }
QJsonDocument doc(gamesArray); QJsonDocument doc(gamesArray);
file.write(doc.toJson()); const QByteArray payload = doc.toJson();
if (file.write(payload) != payload.size()) {
qWarning() << "Failed to save library:" << file.errorString();
return;
}
if (!file.commit()) {
qWarning() << "Failed to save library:" << file.errorString();
return;
}
} }
void App::loadLibrary() void App::loadLibrary()