From 7ad0627b014f3a2368268546fb246bd55dbd3e8a Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 24 Sep 2018 11:06:14 +0300 Subject: Delete directory if there are readonly files Task-number:QTIFW-637 Change-Id: I38b947b10517de68aee5619915886c719cd5e2bf Reviewed-by: Friedemann Kleint --- src/libs/installer/fileutils.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp index 58744b3c2..c142b55f1 100644 --- a/src/libs/installer/fileutils.cpp +++ b/src/libs/installer/fileutils.cpp @@ -173,14 +173,23 @@ void QInstaller::removeFiles(const QString &path, bool ignoreErrors) const QFileInfoList entries = QDir(path).entryInfoList(QDir::AllEntries | QDir::Hidden); foreach (const QFileInfo &fi, entries) { if (fi.isSymLink() || fi.isFile()) { - QFile f(fi.filePath()); - if (!f.remove()) { - const QString errorMessage = QCoreApplication::translate("QInstaller", - "Cannot remove file \"%1\": %2").arg( - QDir::toNativeSeparators(f.fileName()), f.errorString()); - if (!ignoreErrors) - throw Error(errorMessage); - qWarning().noquote() << errorMessage; + QString filePath = fi.filePath(); + QFile f(filePath); + bool ok = f.remove(); + if (!ok) { //ReadOnly can prevent removing in Windows. Change permission and try again. + const QFile::Permissions permissions = f.permissions(); + if (!(permissions & QFile::WriteUser)) { + ok = f.setPermissions(filePath, permissions | QFile::WriteUser) + && f.remove(filePath); + } + if (!ok) { + const QString errorMessage = QCoreApplication::translate("QInstaller", + "Cannot remove file \"%1\": %2").arg( + QDir::toNativeSeparators(f.fileName()), f.errorString()); + if (!ignoreErrors) + throw Error(errorMessage); + qWarning().noquote() << errorMessage; + } } } } -- cgit v1.2.3