diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index cedf84e2291..7f25dc722b3 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -437,8 +437,13 @@ bool FileSaverBase::write(const QByteArray &bytes) bool FileSaverBase::setResult(bool ok) { if (!ok && !m_hasError) { - m_errorString = tr("Cannot write file %1. Disk full?").arg( - QDir::toNativeSeparators(m_fileName)); + if (!m_file->errorString().isEmpty()) { + m_errorString = tr("Cannot write file %1: %2").arg( + QDir::toNativeSeparators(m_fileName), m_file->errorString()); + } else { + m_errorString = tr("Cannot write file %1. Disk full?").arg( + QDir::toNativeSeparators(m_fileName)); + } m_hasError = true; } return ok; diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp index b514d6233d0..aeac15a6273 100644 --- a/src/libs/utils/savefile.cpp +++ b/src/libs/utils/savefile.cpp @@ -113,10 +113,19 @@ bool SaveFile::commit() QString finalFileName = FileUtils::resolveSymlinks(FileName::fromString(m_finalFileName)).toString(); QString bakname = finalFileName + QLatin1Char('~'); - QFile::remove(bakname); // Kill old backup - QFile::rename(finalFileName, bakname); // Backup current file + + if (QFile::exists(finalFileName)) { + QFile::remove(bakname); // Kill old backup + // Try to back up current file + if (!QFile::rename(finalFileName, bakname)) { + remove(); + setErrorString(tr("File might be locked.")); + return false; + } + } if (!rename(finalFileName)) { // Replace current file QFile::rename(bakname, finalFileName); // Rollback to current file + remove(); return false; } if (!m_backup)