From 154f1673e98748837c7c0dfcf3a19398427306ef Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Mon, 13 Jul 2015 20:49:17 +0200 Subject: [PATCH] QSaveFile: Flush temporary file and fsync before renaming. Closes #301 --- src/core/qsavefile.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/core/qsavefile.cpp b/src/core/qsavefile.cpp index bddf18c97..287f9e8e2 100644 --- a/src/core/qsavefile.cpp +++ b/src/core/qsavefile.cpp @@ -46,6 +46,12 @@ #include #include +#ifdef Q_OS_WIN +# include +#else +# include +#endif + QSaveFilePrivate::QSaveFilePrivate() : tempFile(0), error(QFile::NoError) { @@ -283,7 +289,15 @@ bool QSaveFile::commit() qWarning("QSaveFile::commit: File (%s) is not open", qPrintable(fileName())); return false; } - QIODevice::close(); // flush and close + flush(); +#ifdef Q_OS_WIN + FlushFileBuffers(reinterpret_cast(handle())); +#elif defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 + fdatasync(d->tempFile->handle()); +#else + fsync(d->tempFile->handle()); +#endif + QIODevice::close(); if (d->error != QFile::NoError) { d->tempFile->remove(); unsetError();