1 /* 2 * DQt - D bindings for the Qt Toolkit 3 * 4 * GNU Lesser General Public License Usage 5 * This file may be used under the terms of the GNU Lesser 6 * General Public License version 3 as published by the Free Software 7 * Foundation and appearing in the file LICENSE.LGPL3 included in the 8 * packaging of this file. Please review the following information to 9 * ensure the GNU Lesser General Public License version 3 requirements 10 * will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 11 */ 12 module qt.core.dir; 13 extern(C++): 14 15 import qt.config; 16 import qt.core.fileinfo; 17 import qt.core.flags; 18 import qt.core.qchar; 19 import qt.core.shareddata; 20 import qt.core.string; 21 import qt.core.stringlist; 22 import qt.core.typeinfo; 23 import qt.helpers; 24 25 extern(C++, class) struct QDirPrivate; 26 27 /// Binding for C++ class [QDir](https://doc.qt.io/qt-6/qdir.html). 28 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QDir 29 { 30 public: 31 enum Filter { Dirs = 0x001, 32 Files = 0x002, 33 Drives = 0x004, 34 NoSymLinks = 0x008, 35 AllEntries = Filter.Dirs | Filter.Files | Filter.Drives, 36 TypeMask = 0x00f, 37 38 Readable = 0x010, 39 Writable = 0x020, 40 Executable = 0x040, 41 PermissionMask = 0x070, 42 43 Modified = 0x080, 44 Hidden = 0x100, 45 System = 0x200, 46 47 AccessMask = 0x3F0, 48 49 AllDirs = 0x400, 50 CaseSensitive = 0x800, 51 NoDot = 0x2000, 52 NoDotDot = 0x4000, 53 NoDotAndDotDot = Filter.NoDot | Filter.NoDotDot, 54 55 NoFilter = -1 56 } 57 /+ Q_DECLARE_FLAGS(Filters, Filter) +/ 58 alias Filters = QFlags!(Filter); 59 enum SortFlag { Name = 0x00, 60 Time = 0x01, 61 Size = 0x02, 62 Unsorted = 0x03, 63 SortByMask = 0x03, 64 65 DirsFirst = 0x04, 66 Reversed = 0x08, 67 IgnoreCase = 0x10, 68 DirsLast = 0x20, 69 LocaleAware = 0x40, 70 Type = 0x80, 71 NoSort = -1 72 } 73 /+ Q_DECLARE_FLAGS(SortFlags, SortFlag) +/ 74 alias SortFlags = QFlags!(SortFlag); 75 @disable this(this); 76 this(ref const(QDir) ); 77 @disable this(); 78 this(ref const(QString) path/* = globalInitVar!QString*/); 79 this(ref const(QString) path, ref const(QString) nameFilter, 80 SortFlags sort = SortFlags(SortFlag.Name | SortFlag.IgnoreCase), Filters filter = Filter.AllEntries); 81 /+ #ifdef Q_CLANG_QDOC 82 QDir(const std::filesystem::path &path); 83 QDir(const std::filesystem::path &path, const QString &nameFilter, 84 SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries); 85 #elif QT_CONFIG(cxx17_filesystem) 86 template<typename T, QtPrivate::ForceFilesystemPath<T> = 0> 87 QDir(const T &path) : QDir(QtPrivate::fromFilesystemPath(path)) 88 { 89 } 90 template<typename T, QtPrivate::ForceFilesystemPath<T> = 0> 91 QDir(const T &path, const QString &nameFilter, 92 SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries) 93 : QDir(QtPrivate::fromFilesystemPath(path), nameFilter, sort, filter) 94 { 95 } 96 #endif +/ // QT_CONFIG(cxx17_filesystem) 97 ~this(); 98 99 /+ref QDir operator =(ref const(QDir) );+/ 100 /+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QDir) +/ 101 102 /+ void swap(QDir &other) noexcept 103 { qSwap(d_ptr, other.d_ptr); } +/ 104 105 void setPath(ref const(QString) path); 106 /+ #ifdef Q_CLANG_QDOC 107 void setPath(const std::filesystem::path &path); 108 #elif QT_CONFIG(cxx17_filesystem) 109 template<typename T, QtPrivate::ForceFilesystemPath<T> = 0> 110 void setPath(const T &path) 111 { 112 setPath(QtPrivate::fromFilesystemPath(path)); 113 } 114 #endif +/ // QT_CONFIG(cxx17_filesystem) 115 QString path() const; 116 QString absolutePath() const; 117 QString canonicalPath() const; 118 /+ #if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC) 119 std::filesystem::path filesystemPath() const 120 { return QtPrivate::toFilesystemPath(path()); } 121 std::filesystem::path filesystemAbsolutePath() const 122 { return QtPrivate::toFilesystemPath(absolutePath()); } 123 std::filesystem::path filesystemCanonicalPath() const 124 { return QtPrivate::toFilesystemPath(canonicalPath()); } 125 #endif +/ // QT_CONFIG(cxx17_filesystem) 126 127 static void setSearchPaths(ref const(QString) prefix, ref const(QStringList) searchPaths); 128 static void addSearchPath(ref const(QString) prefix, ref const(QString) path); 129 /+ #ifdef Q_CLANG_QDOC 130 static void addSearchPath(const QString &prefix, const std::filesystem::path &path); 131 #elif QT_CONFIG(cxx17_filesystem) 132 template<typename T, QtPrivate::ForceFilesystemPath<T> = 0> 133 static void addSearchPath(const QString &prefix, const T &path) 134 { 135 addSearchPath(prefix, QtPrivate::fromFilesystemPath(path)); 136 } 137 #endif +/ // QT_CONFIG(cxx17_filesystem) 138 static QStringList searchPaths(ref const(QString) prefix); 139 140 QString dirName() const; 141 QString filePath(ref const(QString) fileName) const; 142 QString absoluteFilePath(ref const(QString) fileName) const; 143 QString relativeFilePath(ref const(QString) fileName) const; 144 145 static QString toNativeSeparators(ref const(QString) pathName); 146 static QString fromNativeSeparators(ref const(QString) pathName); 147 148 bool cd(ref const(QString) dirName); 149 bool cdUp(); 150 151 QStringList nameFilters() const; 152 void setNameFilters(ref const(QStringList) nameFilters); 153 154 Filters filter() const; 155 void setFilter(Filters filter); 156 SortFlags sorting() const; 157 void setSorting(SortFlags sort); 158 159 uint count() const; 160 bool isEmpty(Filters filters = Filters(Filter.AllEntries | Filter.NoDotAndDotDot)) const; 161 162 QString opIndex(int) const; 163 164 static QStringList nameFiltersFromString(ref const(QString) nameFilter); 165 166 QStringList entryList(Filters filters = Filter.NoFilter, SortFlags sort = SortFlag.NoSort) const; 167 QStringList entryList(ref const(QStringList) nameFilters, Filters filters = Filter.NoFilter, 168 SortFlags sort = SortFlag.NoSort) const; 169 170 /+QFileInfoList entryInfoList(Filters filters = Filter.NoFilter, SortFlags sort = SortFlag.NoSort) const; 171 QFileInfoList entryInfoList(ref const(QStringList) nameFilters, Filters filters = Filter.NoFilter, 172 SortFlags sort = SortFlag.NoSort) const;+/ 173 174 bool mkdir(ref const(QString) dirName) const; 175 bool rmdir(ref const(QString) dirName) const; 176 bool mkpath(ref const(QString) dirPath) const; 177 bool rmpath(ref const(QString) dirPath) const; 178 179 bool removeRecursively(); 180 181 bool isReadable() const; 182 bool exists() const; 183 bool isRoot() const; 184 185 static bool isRelativePath(ref const(QString) path); 186 pragma(inline, true) static bool isAbsolutePath(ref const(QString) path) { return !isRelativePath(path); } 187 bool isRelative() const; 188 pragma(inline, true) bool isAbsolute() const { return !isRelative(); } 189 bool makeAbsolute(); 190 191 /+bool operator ==(ref const(QDir) dir) const;+/ 192 /+pragma(inline, true) bool operator !=(ref const(QDir) dir) const { return !operator==(dir); }+/ 193 194 bool remove(ref const(QString) fileName); 195 bool rename(ref const(QString) oldName, ref const(QString) newName); 196 bool exists(ref const(QString) name) const; 197 198 //static QFileInfoList drives(); 199 200 pragma(inline, true) static QChar listSeparator()/+ noexcept+/ 201 { 202 static if((versionIsSet!("Windows") && !versionIsSet!("Cygwin"))) 203 { 204 return QChar(QLatin1Char(';')); 205 } 206 else 207 { 208 return QChar(QLatin1Char(':')); 209 } 210 } 211 212 static QChar separator() 213 { 214 static if((versionIsSet!("Windows") && !versionIsSet!("Cygwin"))) 215 { 216 return QChar(QLatin1Char('\\')); 217 } 218 else 219 { 220 return QChar(QLatin1Char('/')); 221 } 222 } 223 224 static bool setCurrent(ref const(QString) path); 225 pragma(inline, true) static QDir current() { auto tmp = currentPath(); return QDir(tmp); } 226 static QString currentPath(); 227 228 pragma(inline, true) static QDir home() { auto tmp = homePath(); return QDir(tmp); } 229 static QString homePath(); 230 pragma(inline, true) static QDir root() { auto tmp = rootPath(); return QDir(tmp); } 231 static QString rootPath(); 232 pragma(inline, true) static QDir temp() { auto tmp = tempPath(); return QDir(tmp); } 233 static QString tempPath(); 234 235 /+ #if QT_CONFIG(regularexpression) +/ 236 static bool match(ref const(QStringList) filters, ref const(QString) fileName); 237 static bool match(ref const(QString) filter, ref const(QString) fileName); 238 /+ #endif +/ 239 240 static QString cleanPath(ref const(QString) path); 241 void refresh() const; 242 243 protected: 244 /+ explicit +/this(ref QDirPrivate d); 245 246 QSharedDataPointer!(QDirPrivate) d_ptr; 247 248 private: 249 /+ friend class QDirIterator; +/ 250 // Q_DECLARE_PRIVATE equivalent for shared data pointers 251 /+ QDirPrivate *d_func(); +/ 252 /+ const QDirPrivate *d_func() const { return d_ptr.constData(); } +/ 253 mixin(CREATE_CONVENIENCE_WRAPPERS); 254 } 255 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator |(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/{return QFlags!(QDir.Filters.enum_type)(f1)|f2;}+/ 256 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator |(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/{return f2|f1;}+/ 257 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator &(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/{return QFlags!(QDir.Filters.enum_type)(f1)&f2;}+/ 258 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator &(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/{return f2&f1;}+/ 259 /+pragma(inline, true) void operator +(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/;+/ 260 /+pragma(inline, true) void operator +(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/ 261 /+pragma(inline, true) void operator +(int f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/ 262 /+pragma(inline, true) void operator -(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/;+/ 263 /+pragma(inline, true) void operator -(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/ 264 /+pragma(inline, true) void operator -(int f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/ 265 /+pragma(inline, true) QIncompatibleFlag operator |(QDir.Filters.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/ 266 /+pragma(inline, true) void operator +(int f1, QDir.Filters.enum_type f2)/+noexcept+/;+/ 267 /+pragma(inline, true) void operator +(QDir.Filters.enum_type f1, int f2)/+noexcept+/;+/ 268 /+pragma(inline, true) void operator -(int f1, QDir.Filters.enum_type f2)/+noexcept+/;+/ 269 /+pragma(inline, true) void operator -(QDir.Filters.enum_type f1, int f2)/+noexcept+/;+/ 270 271 /+ Q_DECLARE_SHARED(QDir) 272 Q_DECLARE_OPERATORS_FOR_FLAGS(QDir::Filters) +/ 273 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator |(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/{return QFlags!(QDir.SortFlags.enum_type)(f1)|f2;}+/ 274 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator |(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/{return f2|f1;}+/ 275 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator &(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/{return QFlags!(QDir.SortFlags.enum_type)(f1)&f2;}+/ 276 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator &(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/{return f2&f1;}+/ 277 /+pragma(inline, true) void operator +(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/ 278 /+pragma(inline, true) void operator +(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/ 279 /+pragma(inline, true) void operator +(int f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/ 280 /+pragma(inline, true) void operator -(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/ 281 /+pragma(inline, true) void operator -(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/ 282 /+pragma(inline, true) void operator -(int f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/ 283 /+pragma(inline, true) QIncompatibleFlag operator |(QDir.SortFlags.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/ 284 /+pragma(inline, true) void operator +(int f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/ 285 /+pragma(inline, true) void operator +(QDir.SortFlags.enum_type f1, int f2)/+noexcept+/;+/ 286 /+pragma(inline, true) void operator -(int f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/ 287 /+pragma(inline, true) void operator -(QDir.SortFlags.enum_type f1, int f2)/+noexcept+/;+/ 288 /+ Q_DECLARE_OPERATORS_FOR_FLAGS(QDir::SortFlags) 289 #ifndef QT_NO_DEBUG_STREAM 290 class QDebug; 291 Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters); 292 Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QDir &dir); 293 #endif +/ 294