/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see .
*/
#ifndef SYNCFOLDER_H
#define SYNCFOLDER_H
#include
#include
#include
#ifndef Q_OS_WIN
#include
#include
#endif
namespace QET {
/**
Force to disk the folder holding @p file_path, once
QSaveFile::commit() renamed a new file into it. QSaveFile syncs the
file it wrote but not the folder, and on some file systems (ext4,
XFS) a power cut soon after can then lose the rename: the previous
file comes back, or none. Does nothing on Windows, where a folder
cannot be synced this way.
*/
inline void syncFolderOf(const QString &file_path)
{
#ifndef Q_OS_WIN
const QByteArray folder = QFile::encodeName(QFileInfo(file_path).absolutePath());
const int fd = ::open(folder.constData(), O_RDONLY | O_DIRECTORY | O_CLOEXEC);
if (fd >= 0) {
::fsync(fd);
::close(fd);
}
#else
Q_UNUSED(file_path)
#endif
}
}
#endif // SYNCFOLDER_H