summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/io/qdir.cpp65
-rw-r--r--src/corelib/io/qdir.h44
-rw-r--r--src/corelib/io/qfile.cpp50
-rw-r--r--src/corelib/io/qfile.h107
-rw-r--r--src/corelib/io/qfileinfo.cpp81
-rw-r--r--src/corelib/io/qfileinfo.h38
6 files changed, 380 insertions, 5 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 5ce3fbcca8..20af40f973 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -585,8 +585,8 @@ QDir::QDir(const QString &path) : d_ptr(new QDirPrivate(path))
also sorts the names using \a sort.
The default \a nameFilter is an empty string, which excludes
- nothing; the default \a filters is \l AllEntries, which also means
- exclude nothing. The default \a sort is \l Name | \l IgnoreCase,
+ nothing; the default \a filters is \l AllEntries, which also
+ excludes nothing. The default \a sort is \l Name | \l IgnoreCase,
i.e. sort by name case-insensitively.
If \a path is an empty string, QDir uses "." (the current
@@ -2551,4 +2551,65 @@ QDebug operator<<(QDebug debug, const QDir &dir)
}
#endif // QT_NO_DEBUG_STREAM
+/*!
+ \fn QDir::QDir(const std::filesystem::path &path)
+ \since 6.0
+ Constructs a QDir pointing to the given directory \a path. If path
+ is empty the program's working directory, ("."), is used.
+
+ \sa currentPath()
+*/
+/*!
+ \fn QDir::QDir(const std::filesystem::path &path,
+ const QString &nameFilter,
+ SortFlags sort,
+ Filters filters)
+ \since 6.0
+
+ Constructs a QDir with path \a path, that filters its entries by
+ name using \a nameFilter and by attributes using \a filters. It
+ also sorts the names using \a sort.
+
+ The default \a nameFilter is an empty string, which excludes
+ nothing; the default \a filters is \l AllEntries, which also
+ excludes nothing. The default \a sort is \l Name | \l IgnoreCase,
+ i.e. sort by name case-insensitively.
+
+ If \a path is empty, QDir uses "." (the current
+ directory). If \a nameFilter is an empty string, QDir uses the
+ name filter "*" (all files).
+
+ Note that \a path need not exist.
+
+ \sa exists(), setPath(), setNameFilters(), setFilter(), setSorting()
+*/
+/*!
+ \fn void QDir::setPath(const std::filesystem::path &path)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn void QDir::addSearchPath(const QString &prefix, const std::filesystem::path &path)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn std::filesystem::path QDir::filesystemPath() const
+ \since 6.0
+ Returns path() as \c{std::filesystem::path}.
+ \sa path()
+*/
+/*!
+ \fn std::filesystem::path QDir::filesystemAbsolutePath() const
+ \since 6.0
+ Returns absolutePath() as \c{std::filesystem::path}.
+ \sa absolutePath()
+*/
+/*!
+ \fn std::filesystem::path QDir::filesystemCanonicalPath() const
+ \since 6.0
+ Returns canonicalPath() as \c{std::filesystem::path}.
+ \sa canonicalPath()
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/io/qdir.h b/src/corelib/io/qdir.h
index 45a40995f8..f0dda73ebb 100644
--- a/src/corelib/io/qdir.h
+++ b/src/corelib/io/qdir.h
@@ -41,13 +41,13 @@
#define QDIR_H
#include <QtCore/qstring.h>
+#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qshareddata.h>
QT_BEGIN_NAMESPACE
-
class QDirIterator;
class QDirPrivate;
@@ -102,6 +102,22 @@ public:
QDir(const QString &path = QString());
QDir(const QString &path, const QString &nameFilter,
SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
+#ifdef Q_CLANG_QDOC
+ QDir(const std::filesystem::path &path);
+ QDir(const std::filesystem::path &path, const QString &nameFilter,
+ SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QDir(const T &path) : QDir(QtPrivate::fromFilesystemPath(path))
+ {
+ }
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QDir(const T &path, const QString &nameFilter,
+ SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries)
+ : QDir(QtPrivate::fromFilesystemPath(path), nameFilter, sort, filter)
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
~QDir();
QDir &operator=(const QDir &);
@@ -115,9 +131,26 @@ public:
{ qSwap(d_ptr, other.d_ptr); }
void setPath(const QString &path);
+#ifdef Q_CLANG_QDOC
+ void setPath(const std::filesystem::path &path);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ void setPath(const T &path)
+ {
+ setPath(QtPrivate::fromFilesystemPath(path));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
QString path() const;
QString absolutePath() const;
QString canonicalPath() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemPath() const
+ { return QtPrivate::toFilesystemPath(path()); }
+ std::filesystem::path filesystemAbsolutePath() const
+ { return QtPrivate::toFilesystemPath(absolutePath()); }
+ std::filesystem::path filesystemCanonicalPath() const
+ { return QtPrivate::toFilesystemPath(canonicalPath()); }
+#endif // QT_CONFIG(cxx17_filesystem)
#if QT_DEPRECATED_SINCE(5, 13)
QT_DEPRECATED_X("Use QDir::addSearchPath() instead")
@@ -126,6 +159,15 @@ public:
static void setSearchPaths(const QString &prefix, const QStringList &searchPaths);
static void addSearchPath(const QString &prefix, const QString &path);
+#ifdef Q_CLANG_QDOC
+ static void addSearchPath(const QString &prefix, const std::filesystem::path &path);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ static void addSearchPath(const QString &prefix, const T &path)
+ {
+ addSearchPath(prefix, QtPrivate::fromFilesystemPath(path));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static QStringList searchPaths(const QString &prefix);
QString dirName() const;
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 0cdc5bd6d3..2a9c24bbd5 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -1210,6 +1210,56 @@ qint64 QFile::size() const
return QFileDevice::size(); // for now
}
+/*!
+ \fn QFile::QFile(const std::filesystem::path &name)
+ \since 6.0
+
+ Constructs a new file object to represent the file with the given \a name.
+*/
+/*!
+ \fn QFile::QFile(const std::filesystem::path &name, QObject *parent)
+ \since 6.0
+
+ Constructs a new file object with the given \a parent to represent the
+ file with the specified \a name.
+*/
+/*!
+ \fn std::filesystem::path QFile::filesystemFileName() const
+ \since 6.0
+ Returns fileName() as \c{std::filesystem::path}.
+*/
+/*!
+ \fn void QFile::setFileName(const std::filesystem::path &name)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::rename(const std::filesystem::path &newName)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::link(const std::filesystem::path &newName)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::copy(const std::filesystem::path &newName)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn QFile::Permissions QFile::permissions(const std::filesystem::path &filename)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::setPermissions(const std::filesystem::path &filename, Permissions permissionSpec)
+ \since 6.0
+ \overload
+*/
+
+
QT_END_NAMESPACE
#ifndef QT_NO_QOBJECT
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h
index 917fec4e1a..dab20b85a1 100644
--- a/src/corelib/io/qfile.h
+++ b/src/corelib/io/qfile.h
@@ -45,12 +45,44 @@
#include <QtCore/qstring.h>
#include <stdio.h>
+#if QT_CONFIG(cxx17_filesystem)
+#include <filesystem>
+#endif
+
#ifdef open
#error qfile.h must be included before any header file that defines open
#endif
QT_BEGIN_NAMESPACE
+#if QT_CONFIG(cxx17_filesystem)
+namespace QtPrivate {
+inline QString fromFilesystemPath(const std::filesystem::path &path)
+{
+#ifdef Q_OS_WIN
+ return QString::fromStdWString(path.native());
+#else
+ return QString::fromStdString(path.native());
+#endif
+}
+
+inline std::filesystem::path toFilesystemPath(const QString &path)
+{
+#ifdef Q_OS_WIN
+ return std::filesystem::path(path.toStdU16String());
+#else
+ return std::filesystem::path(path.toStdString());
+#endif
+}
+
+// Both std::filesystem::path and QString (without QT_NO_CAST_FROM_ASCII) can be implicitly
+// constructed from string literals so we force the std::fs::path parameter to only
+// accept std::fs::path with no implicit conversions.
+template<typename T>
+using ForceFilesystemPath = typename std::enable_if_t<std::is_same_v<std::filesystem::path, T>, int>;
+}
+#endif // QT_CONFIG(cxx17_filesystem)
+
class QTemporaryFile;
class QFilePrivate;
@@ -64,14 +96,45 @@ class Q_CORE_EXPORT QFile : public QFileDevice
public:
QFile();
QFile(const QString &name);
+#ifdef Q_CLANG_QDOC
+ QFile(const std::filesystem::path &name);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFile(const T &name) : QFile(QtPrivate::fromFilesystemPath(name))
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
+
#ifndef QT_NO_QOBJECT
explicit QFile(QObject *parent);
QFile(const QString &name, QObject *parent);
-#endif
+
+#ifdef Q_CLANG_QDOC
+ QFile(const std::filesystem::path &path, QObject *parent);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFile(const T &path, QObject *parent) : QFile(QtPrivate::fromFilesystemPath(path), parent)
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
+#endif // !QT_NO_QOBJECT
~QFile();
QString fileName() const override;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemFileName() const
+ { return QtPrivate::toFilesystemPath(fileName()); }
+#endif
void setFileName(const QString &name);
+#ifdef Q_CLANG_QDOC
+ void setFileName(const std::filesystem::path &name);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ void setFileName(const T &name)
+ {
+ setFileName(QtPrivate::fromFilesystemPath(name));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
#if defined(Q_OS_DARWIN)
// Mac always expects filenames in UTF-8... and decomposed...
@@ -129,12 +192,39 @@ public:
static bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr);
bool rename(const QString &newName);
+#ifdef Q_CLANG_QDOC
+ bool rename(const std::filesystem::path &newName);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ bool rename(const T &newName)
+ {
+ return rename(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static bool rename(const QString &oldName, const QString &newName);
bool link(const QString &newName);
+#ifdef Q_CLANG_QDOC
+ bool link(const std::filesystem::path &newName);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ bool link(const T &newName)
+ {
+ return link(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static bool link(const QString &oldname, const QString &newName);
bool copy(const QString &newName);
+#ifdef Q_CLANG_QDOC
+ bool copy(const std::filesystem::path &newName);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ bool copy(const T &newName)
+ {
+ return copy(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static bool copy(const QString &fileName, const QString &newName);
bool open(OpenMode flags) override;
@@ -150,6 +240,21 @@ public:
static Permissions permissions(const QString &filename);
bool setPermissions(Permissions permissionSpec) override;
static bool setPermissions(const QString &filename, Permissions permissionSpec);
+#ifdef Q_CLANG_QDOC
+ static Permissions permissions(const std::filesystem::path &filename);
+ static bool setPermissions(const std::filesystem::path &filename, Permissions permissionSpec);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ static Permissions permissions(const T &filename)
+ {
+ return permissions(QtPrivate::fromFilesystemPath(filename));
+ }
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ static bool setPermissions(const T &filename, Permissions permissionSpec)
+ {
+ return setPermissions(QtPrivate::fromFilesystemPath(filename), permissionSpec);
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
protected:
#ifdef QT_NO_QOBJECT
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 64b1557231..479532fc36 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -363,7 +363,7 @@ QFileInfo::QFileInfo(const QFile &file) : d_ptr(new QFileInfoPrivate(file.fileNa
/*!
Constructs a new QFileInfo that gives information about the given
- \a file in the directory \a dir.
+ \a file relative to the directory \a dir.
If \a dir has a relative path, the QFileInfo will also have a
relative path.
@@ -1576,4 +1576,83 @@ QDebug operator<<(QDebug dbg, const QFileInfo &fi)
}
#endif
+/*!
+ \fn QFileInfo::QFileInfo(const std::filesystem::path &file)
+ \since 6.0
+
+ Constructs a new QFileInfo that gives information about the given
+ \a file.
+
+ \sa setFile(), isRelative(), QDir::setCurrent(), QDir::isRelativePath()
+*/
+/*!
+ \fn QFileInfo::QFileInfo(const QDir &dir, const std::filesystem::path &file)
+ \since 6.0
+
+ Constructs a new QFileInfo that gives information about the given
+ \a file relative to the directory \a dir.
+
+ If \a dir has a relative path, the QFileInfo will also have a
+ relative path.
+
+ If \a file is an absolute path, then the directory specified
+ by \a dir will be disregarded.
+*/
+/*!
+ \fn void QFileInfo::setFile(const std::filesystem::path &file)
+ \since 6.0
+
+ Sets the file that the QFileInfo provides information about to \a
+ file.
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemFilePath() const
+ \since 6.0
+
+ Returns filePath() as a \c{std::filesystem::path}.
+ \sa filePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemAbsoluteFilePath() const
+ \since 6.0
+
+ Returns absoluteFilePath() as a \c{std::filesystem::path}.
+ \sa absoluteFilePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemCanonicalFilePath() const
+ \since 6.0
+
+ Returns canonicalFilePath() as a \c{std::filesystem::path}.
+ \sa canonicalFilePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemPath() const
+ \since 6.0
+
+ Returns path() as a \c{std::filesystem::path}.
+ \sa path()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemAbsolutePath() const
+ \since 6.0
+
+ Returns absolutePath() as a \c{std::filesystem::path}.
+ \sa absolutePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemCanonicalPath() const
+ \since 6.0
+
+ Returns canonicalPath() as a \c{std::filesystem::path}.
+ \sa canonicalPath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemSymLinkTarget() const
+ \since 6.0
+
+ Returns symLinkTarget() as a \c{std::filesystem::path}.
+ \sa symLinkTarget()
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index 7c7ff56ae4..2bed64eb1a 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -64,6 +64,18 @@ public:
QFileInfo(const QFile &file);
QFileInfo(const QDir &dir, const QString &file);
QFileInfo(const QFileInfo &fileinfo);
+#ifdef Q_CLANG_QDOC
+ QFileInfo(const std::filesystem::path &file);
+ QFileInfo(const QDir &dir, const std::filesystem::path &file);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFileInfo(const T &file) : QFileInfo(QtPrivate::fromFilesystemPath(file)) { }
+
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFileInfo(const QDir &dir, const T &file) : QFileInfo(dir, QtPrivate::fromFilesystemPath(file))
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
~QFileInfo();
QFileInfo &operator=(const QFileInfo &fileinfo);
@@ -78,6 +90,13 @@ public:
void setFile(const QString &file);
void setFile(const QFile &file);
void setFile(const QDir &dir, const QString &file);
+#ifdef Q_CLANG_QDOC
+ void setFile(const std::filesystem::path &file);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ void setFile(const T &file) { setFile(QtPrivate::fromFilesystemPath(file)); }
+#endif // QT_CONFIG(cxx17_filesystem)
+
bool exists() const;
static bool exists(const QString &file);
void refresh();
@@ -85,6 +104,14 @@ public:
QString filePath() const;
QString absoluteFilePath() const;
QString canonicalFilePath() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemFilePath() const
+ { return QtPrivate::toFilesystemPath(filePath()); }
+ std::filesystem::path filesystemAbsoluteFilePath() const
+ { return QtPrivate::toFilesystemPath(absoluteFilePath()); }
+ std::filesystem::path filesystemCanonicalFilePath() const
+ { return QtPrivate::toFilesystemPath(canonicalFilePath()); }
+#endif // QT_CONFIG(cxx17_filesystem)
QString fileName() const;
QString baseName() const;
QString completeBaseName() const;
@@ -95,6 +122,13 @@ public:
QString path() const;
QString absolutePath() const;
QString canonicalPath() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemPath() const { return QtPrivate::toFilesystemPath(path()); }
+ std::filesystem::path filesystemAbsolutePath() const
+ { return QtPrivate::toFilesystemPath(absolutePath()); }
+ std::filesystem::path filesystemCanonicalPath() const
+ { return QtPrivate::toFilesystemPath(canonicalPath()); }
+#endif // QT_CONFIG(cxx17_filesystem)
QDir dir() const;
QDir absoluteDir() const;
@@ -122,6 +156,10 @@ public:
QString readLink() const;
#endif
QString symLinkTarget() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemSymLinkTarget() const
+ { return QtPrivate::toFilesystemPath(symLinkTarget()); }
+#endif // QT_CONFIG(cxx17_filesystem)
QString owner() const;
uint ownerId() const;