aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/fileutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/utils/fileutils.cpp')
-rw-r--r--src/libs/utils/fileutils.cpp89
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)