diff options
Diffstat (limited to 'src/libs/utils/fileutils.cpp')
-rw-r--r-- | src/libs/utils/fileutils.cpp | 89 |
1 files changed, 76 insertions, 13 deletions
diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 6b7b0b2a09..4b55c08301 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -31,9 +31,9 @@ #include "qtcprocess.h" #include <QDataStream> -#include <QDir> -#include <QDebug> #include <QDateTime> +#include <QDebug> +#include <QDir> #include <QOperatingSystemVersion> #include <QRegularExpression> #include <QTimer> @@ -160,10 +160,10 @@ bool FileUtils::removeRecursively(const FilePath &filePath, QString *error) return false; } - QStringList fileNames = dir.entryList(QDir::Files | QDir::Hidden - | QDir::System | QDir::Dirs | QDir::NoDotAndDotDot); - foreach (const QString &fileName, fileNames) { - if (!removeRecursively(filePath.pathAppended(fileName), error)) + const QStringList fileNames = dir.entryList( + QDir::Files | QDir::Hidden | QDir::System | QDir::Dirs | QDir::NoDotAndDotDot); + for (const QString &fileName : fileNames) { + if (!removeRecursively(filePath / fileName, error)) return false; } if (!QDir::root().rmdir(dir.path())) { @@ -219,11 +219,11 @@ bool FileUtils::copyRecursively(const FilePath &srcFilePath, const FilePath &tgt } } QDir sourceDir(srcFilePath.toString()); - QStringList fileNames = sourceDir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot - | QDir::Hidden | QDir::System); - foreach (const QString &fileName, fileNames) { - const FilePath newSrcFilePath = srcFilePath.pathAppended(fileName); - const FilePath newTgtFilePath = tgtFilePath.pathAppended(fileName); + const QStringList fileNames = sourceDir.entryList( + QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System); + for (const QString &fileName : fileNames) { + const FilePath newSrcFilePath = srcFilePath / fileName; + const FilePath newTgtFilePath = tgtFilePath / fileName; if (!copyRecursively(newSrcFilePath, newTgtFilePath, error, copyHelper)) return false; } @@ -304,6 +304,11 @@ FilePath FilePath::canonicalPath() const return FilePath::fromString(result); } +FilePath FilePath::operator/(const QString &str) const +{ + return pathAppended(str); +} + /*! Like QDir::toNativeSeparators(), but use prefix '~' instead of $HOME on unix systems when an absolute path is given. @@ -837,10 +842,10 @@ FilePath FilePath::fromStringWithExtension(const QString &filepath, const QStrin } /// Constructs a FilePath from \a filePath -/// \a filePath is only passed through QDir::cleanPath +/// \a filePath is only passed through QDir::fromNativeSeparators FilePath FilePath::fromUserInput(const QString &filePath) { - QString clean = QDir::cleanPath(filePath); + QString clean = QDir::fromNativeSeparators(filePath); if (clean.startsWith(QLatin1String("~/"))) clean = QDir::homePath() + clean.mid(1); return FilePath::fromString(clean); @@ -986,6 +991,64 @@ QTextStream &operator<<(QTextStream &s, const FilePath &fn) return s << fn.toString(); } +#ifdef QT_GUI_LIB +FileUtils::CopyAskingForOverwrite::CopyAskingForOverwrite(QWidget *dialogParent) + : m_parent(dialogParent) +{} + +bool FileUtils::CopyAskingForOverwrite::operator()(const QFileInfo &src, + const QFileInfo &dest, + QString *error) +{ + bool copyFile = true; + if (dest.exists()) { + if (m_skipAll) + copyFile = false; + else if (!m_overwriteAll) { + const int res = QMessageBox::question( + m_parent, + QCoreApplication::translate("Utils::FileUtils", "Overwrite File?"), + QCoreApplication::translate("Utils::FileUtils", "Overwrite existing file \"%1\"?") + .arg(FilePath::fromFileInfo(dest).toUserOutput()), + QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll + | QMessageBox::Cancel); + if (res == QMessageBox::Cancel) { + return false; + } else if (res == QMessageBox::No) { + copyFile = false; + } else if (res == QMessageBox::NoToAll) { + m_skipAll = true; + copyFile = false; + } else if (res == QMessageBox::YesToAll) { + m_overwriteAll = true; + } + if (copyFile) + QFile::remove(dest.filePath()); + } + } + if (copyFile) { + if (!dest.absoluteDir().exists()) + dest.absoluteDir().mkpath(dest.absolutePath()); + if (!QFile::copy(src.filePath(), dest.filePath())) { + if (error) { + *error = QCoreApplication::translate("Utils::FileUtils", + "Could not copy file \"%1\" to \"%2\".") + .arg(FilePath::fromFileInfo(src).toUserOutput(), + FilePath::fromFileInfo(dest).toUserOutput()); + } + return false; + } + } + m_files.append(dest.absoluteFilePath()); + return true; +} + +QStringList FileUtils::CopyAskingForOverwrite::files() const +{ + return m_files; +} +#endif // QT_GUI_LIB + #ifdef Q_OS_WIN template <> void withNtfsPermissions(const std::function<void()> &task) |