QtBase  v6.3.1
qdir.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #include "qplatformdefs.h"
41 #include "qdir.h"
42 #include "qdir_p.h"
43 #include "qabstractfileengine_p.h"
44 #include "qfsfileengine_p.h"
45 #ifndef QT_NO_DEBUG_STREAM
46 #include "qdebug.h"
47 #endif
48 #include "qdiriterator.h"
49 #include "qdatetime.h"
50 #include "qstring.h"
51 #if QT_CONFIG(regularexpression)
52 # include <qregularexpression.h>
53 #endif
54 #include "qvarlengtharray.h"
55 #include "qfilesystementry_p.h"
56 #include "qfilesystemmetadata_p.h"
57 #include "qfilesystemengine_p.h"
58 #include <qstringbuilder.h>
59 
60 #ifdef QT_BUILD_CORE_LIB
61 # include "qresource.h"
62 # include "private/qcoreglobaldata_p.h"
63 #endif
64 
65 #include <algorithm>
66 #include <memory>
67 #include <stdlib.h>
68 
70 
71 #if defined(Q_OS_WIN)
72 static QString driveSpec(const QString &path)
73 {
74  if (path.size() < 2)
75  return QString();
76  char c = path.at(0).toLatin1();
77  if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z'))
78  return QString();
79  if (path.at(1).toLatin1() != ':')
80  return QString();
81  return path.mid(0, 2);
82 }
83 #endif
84 
85 enum {
86 #if defined(Q_OS_WIN)
87  OSSupportsUncPaths = true
88 #else
89  OSSupportsUncPaths = false
90 #endif
91 };
92 
93 // Return the length of the root part of an absolute path, for use by cleanPath(), cd().
94 static int rootLength(const QString &name, bool allowUncPaths)
95 {
96  const int len = name.length();
97  // starts with double slash
98  if (allowUncPaths && name.startsWith(QLatin1String("//"))) {
99  // Server name '//server/path' is part of the prefix.
100  const int nextSlash = name.indexOf(QLatin1Char('/'), 2);
101  return nextSlash >= 0 ? nextSlash + 1 : len;
102  }
103 #if defined(Q_OS_WIN)
104  if (len >= 2 && name.at(1) == QLatin1Char(':')) {
105  // Handle a possible drive letter
106  return len > 2 && name.at(2) == QLatin1Char('/') ? 3 : 2;
107  }
108 #endif
109  if (name.at(0) == QLatin1Char('/'))
110  return 1;
111  return 0;
112 }
113 
114 //************* QDirPrivate
115 QDirPrivate::QDirPrivate(const QString &path, const QStringList &nameFilters_, QDir::SortFlags sort_, QDir::Filters filters_)
116  : QSharedData()
117  , fileListsInitialized(false)
118  , nameFilters(nameFilters_)
119  , sort(sort_)
120  , filters(filters_)
121 {
122  setPath(path.isEmpty() ? QString::fromLatin1(".") : path);
123 
124  bool empty = nameFilters.isEmpty();
125  if (!empty) {
126  empty = true;
127  for (int i = 0; i < nameFilters.size(); ++i) {
128  if (!nameFilters.at(i).isEmpty()) {
129  empty = false;
130  break;
131  }
132  }
133  }
134  if (empty)
136 }
137 
139  : QSharedData(copy)
140  , fileListsInitialized(false)
141  , nameFilters(copy.nameFilters)
142  , sort(copy.sort)
143  , filters(copy.filters)
144  , dirEntry(copy.dirEntry)
145  , metaData(copy.metaData)
146 {
147 }
148 
150 {
151  if (!fileEngine) {
154  return metaData.exists() && metaData.isDirectory();
155  }
156  const QAbstractFileEngine::FileFlags info =
161  return false;
162  return info.testAnyFlag(QAbstractFileEngine::ExistsFlag);
163 }
164 
165 // static
166 inline QChar QDirPrivate::getFilterSepChar(const QString &nameFilter)
167 {
168  QChar sep(QLatin1Char(';'));
169  int i = nameFilter.indexOf(sep, 0);
170  if (i == -1 && nameFilter.indexOf(QLatin1Char(' '), 0) != -1)
171  sep = QChar(QLatin1Char(' '));
172  return sep;
173 }
174 
175 // static
176 inline QStringList QDirPrivate::splitFilters(const QString &nameFilter, QChar sep)
177 {
178  if (sep.isNull())
179  sep = getFilterSepChar(nameFilter);
181  for (auto e : qTokenize(nameFilter, sep))
182  ret.append(e.trimmed().toString());
183  return ret;
184 }
185 
186 inline void QDirPrivate::setPath(const QString &path)
187 {
189  if (p.endsWith(QLatin1Char('/'))
190  && p.length() > 1
191 #if defined(Q_OS_WIN)
192  && (!(p.length() == 3 && p.at(1).unicode() == ':' && p.at(0).isLetter()))
193 #endif
194  ) {
195  p.truncate(p.length() - 1);
196  }
197 
199  metaData.clear();
200  initFileEngine();
201  clearFileLists();
203 }
204 
206 {
207  fileListsInitialized = false;
208  files.clear();
209  fileInfos.clear();
210 }
211 
213 {
215  return;
216 
217  QString absoluteName;
218  if (!fileEngine) {
219  if (!dirEntry.isRelative() && dirEntry.isClean()) {
221  return;
222  }
223 
225  } else {
226  absoluteName = fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
227  }
228 
230 }
231 
232 /* For sorting */
234 {
238 };
239 
240 
242 {
243  QDir::SortFlags qt_cmp_si_sort_flags;
244 public:
245  QDirSortItemComparator(QDir::SortFlags flags) : qt_cmp_si_sort_flags(flags) {}
246  bool operator()(const QDirSortItem &, const QDirSortItem &) const;
247 };
248 
250 {
251  const QDirSortItem* f1 = &n1;
252  const QDirSortItem* f2 = &n2;
253 
254  if ((qt_cmp_si_sort_flags & QDir::DirsFirst) && (f1->item.isDir() != f2->item.isDir()))
255  return f1->item.isDir();
256  if ((qt_cmp_si_sort_flags & QDir::DirsLast) && (f1->item.isDir() != f2->item.isDir()))
257  return !f1->item.isDir();
258 
259  qint64 r = 0;
260  int sortBy = ((qt_cmp_si_sort_flags & QDir::SortByMask)
261  | (qt_cmp_si_sort_flags & QDir::Type)).toInt();
262 
263  switch (sortBy) {
264  case QDir::Time: {
265  QDateTime firstModified = f1->item.lastModified();
266  QDateTime secondModified = f2->item.lastModified();
267 
268  // QDateTime by default will do all sorts of conversions on these to
269  // find timezones, which is incredibly expensive. As we aren't
270  // presenting these to the user, we don't care (at all) about the
271  // local timezone, so force them to UTC to avoid that conversion.
272  firstModified.setTimeSpec(Qt::UTC);
273  secondModified.setTimeSpec(Qt::UTC);
274 
275  r = firstModified.msecsTo(secondModified);
276  break;
277  }
278  case QDir::Size:
279  r = f2->item.size() - f1->item.size();
280  break;
281  case QDir::Type:
282  {
283  bool ic = qt_cmp_si_sort_flags.testAnyFlag(QDir::IgnoreCase);
284 
285  if (f1->suffix_cache.isNull())
286  f1->suffix_cache = ic ? f1->item.suffix().toLower()
287  : f1->item.suffix();
288  if (f2->suffix_cache.isNull())
289  f2->suffix_cache = ic ? f2->item.suffix().toLower()
290  : f2->item.suffix();
291 
292  r = qt_cmp_si_sort_flags & QDir::LocaleAware
294  : f1->suffix_cache.compare(f2->suffix_cache);
295  }
296  break;
297  default:
298  ;
299  }
300 
301  if (r == 0 && sortBy != QDir::Unsorted) {
302  // Still not sorted - sort by name
303  bool ic = qt_cmp_si_sort_flags.testAnyFlag(QDir::IgnoreCase);
304 
305  if (f1->filename_cache.isNull())
306  f1->filename_cache = ic ? f1->item.fileName().toLower()
307  : f1->item.fileName();
308  if (f2->filename_cache.isNull())
309  f2->filename_cache = ic ? f2->item.fileName().toLower()
310  : f2->item.fileName();
311 
312  r = qt_cmp_si_sort_flags & QDir::LocaleAware
315  }
316  if (qt_cmp_si_sort_flags & QDir::Reversed)
317  return r > 0;
318  return r < 0;
319 }
320 
321 inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QFileInfoList &l,
323 {
324  // names and infos are always empty lists or 0 here
325  int n = l.size();
326  if (n > 0) {
327  if (n == 1 || (sort & QDir::SortByMask) == QDir::Unsorted) {
328  if (infos)
329  *infos = l;
330  if (names) {
331  for (int i = 0; i < n; ++i)
332  names->append(l.at(i).fileName());
333  }
334  } else {
336  for (int i = 0; i < n; ++i)
337  si[i].item = l.at(i);
338  std::sort(si.data(), si.data() + n, QDirSortItemComparator(sort));
339  // put them back in the list(s)
340  if (infos) {
341  for (int i = 0; i < n; ++i)
342  infos->append(si[i].item);
343  }
344  if (names) {
345  for (int i = 0; i < n; ++i)
346  names->append(si[i].item.fileName());
347  }
348  }
349  }
350 }
351 inline void QDirPrivate::initFileLists(const QDir &dir) const
352 {
353  if (!fileListsInitialized) {
356  while (it.hasNext())
357  l.append(it.nextFileInfo());
359  fileListsInitialized = true;
360  }
361 }
362 
364 {
366 }
367 
559 {
560 }
561 
568 QDir::QDir(const QString &path) : d_ptr(new QDirPrivate(path))
569 {
570 }
571 
590 QDir::QDir(const QString &path, const QString &nameFilter,
591  SortFlags sort, Filters filters)
592  : d_ptr(new QDirPrivate(path, QDir::nameFiltersFromString(nameFilter), sort, filters))
593 {
594 }
595 
603  : d_ptr(dir.d_ptr)
604 {
605 }
606 
612 {
613 }
614 
632 {
633  d_ptr->setPath(path);
634 }
635 
647 {
648  const QDirPrivate* d = d_ptr.constData();
649  return d->dirEntry.filePath();
650 }
651 
661 {
662  const QDirPrivate* d = d_ptr.constData();
663  d->resolveAbsoluteEntry();
664  return d->absoluteDirEntry.filePath();
665 }
666 
684 {
685  const QDirPrivate* d = d_ptr.constData();
686  if (!d->fileEngine) {
687  QFileSystemEntry answer = QFileSystemEngine::canonicalName(d->dirEntry, d->metaData);
688  return answer.filePath();
689  }
690  return d->fileEngine->fileName(QAbstractFileEngine::CanonicalName);
691 }
692 
705 {
706  const QDirPrivate* d = d_ptr.constData();
707  return d->dirEntry.fileName();
708 }
709 
710 
711 #ifdef Q_OS_WIN
712 static int drivePrefixLength(const QString &path)
713 {
714  // Used to extract path's drive for use as prefix for an "absolute except for drive" path
715  const int size = path.length();
716  int drive = 2; // length of drive prefix
717  if (size > 1 && path.at(1).unicode() == ':') {
718  if (Q_UNLIKELY(!path.at(0).isLetter()))
719  return 0;
720  } else if (path.startsWith(QLatin1String("//"))) {
721  // UNC path; use its //server/share part as "drive" - it's as sane a
722  // thing as we can do.
723  for (int i = 2; i-- > 0; ) { // Scan two "path fragments":
724  while (drive < size && path.at(drive).unicode() == '/')
725  drive++;
726  if (drive >= size) {
727  qWarning("Base directory starts with neither a drive nor a UNC share: %s",
728  qUtf8Printable(QDir::toNativeSeparators(path)));
729  return 0;
730  }
731  while (drive < size && path.at(drive).unicode() != '/')
732  drive++;
733  }
734  } else {
735  return 0;
736  }
737  return drive;
738 }
739 #endif // Q_OS_WIN
740 
741 static bool treatAsAbsolute(const QString &path)
742 {
743  // ### Qt 6: be consistent about absolute paths
744 
745  // QFileInfo will use the right FS-engine for virtual file-systems
746  // (e.g. resource paths). Unfortunately, for real file-systems, it relies
747  // on QFileSystemEntry's isRelative(), which is flawed on MS-Win, ignoring
748  // its (correct) isAbsolute(). So only use that isAbsolute() unless there's
749  // a colon in the path.
750  // FIXME: relies on virtual file-systems having colons in their prefixes.
751  // The case of an MS-absolute C:/... path happens to work either way.
752  return (path.contains(QLatin1Char(':')) && QFileInfo(path).isAbsolute())
754 }
755 
766 {
767  if (treatAsAbsolute(fileName))
768  return fileName;
769 
770  const QDirPrivate* d = d_ptr.constData();
771  QString ret = d->dirEntry.filePath();
772  if (fileName.isEmpty())
773  return ret;
774 
775 #ifdef Q_OS_WIN
776  if (fileName.startsWith(QLatin1Char('/')) || fileName.startsWith(QLatin1Char('\\'))) {
777  // Handle the "absolute except for drive" case (i.e. \blah not c:\blah):
778  const int drive = drivePrefixLength(ret);
779  return drive > 0 ? QStringView{ret}.left(drive) % fileName : fileName;
780  }
781 #endif // Q_OS_WIN
782 
783  if (ret.isEmpty() || ret.endsWith(QLatin1Char('/')))
784  return ret % fileName;
785  return ret % QLatin1Char('/') % fileName;
786 }
787 
797 {
798  if (treatAsAbsolute(fileName))
799  return fileName;
800 
801  const QDirPrivate* d = d_ptr.constData();
802  d->resolveAbsoluteEntry();
803  const QString absoluteDirPath = d->absoluteDirEntry.filePath();
804  if (fileName.isEmpty())
805  return absoluteDirPath;
806 #ifdef Q_OS_WIN
807  // Handle the "absolute except for drive" case (i.e. \blah not c:\blah):
808  if (fileName.startsWith(QLatin1Char('/')) || fileName.startsWith(QLatin1Char('\\'))) {
809  // Combine absoluteDirPath's drive with fileName
810  const int drive = drivePrefixLength(absoluteDirPath);
811  if (Q_LIKELY(drive))
812  return QStringView{absoluteDirPath}.left(drive) % fileName;
813 
814  qWarning("Base directory's drive is not a letter: %s",
815  qUtf8Printable(QDir::toNativeSeparators(absoluteDirPath)));
816  return QString();
817  }
818 #endif // Q_OS_WIN
819  if (!absoluteDirPath.endsWith(QLatin1Char('/')))
820  return absoluteDirPath % QLatin1Char('/') % fileName;
821  return absoluteDirPath % fileName;
822 }
823 
832 {
835 
837  return file;
838 
839 #ifdef Q_OS_WIN
840  QString dirDrive = driveSpec(dir);
841  QString fileDrive = driveSpec(file);
842 
843  bool fileDriveMissing = false;
844  if (fileDrive.isEmpty()) {
845  fileDrive = dirDrive;
846  fileDriveMissing = true;
847  }
848 
849  if (fileDrive.toLower() != dirDrive.toLower()
850  || (file.startsWith(QLatin1String("//"))
851  && !dir.startsWith(QLatin1String("//"))))
852  return file;
853 
854  dir.remove(0, dirDrive.size());
855  if (!fileDriveMissing)
856  file.remove(0, fileDrive.size());
857 #endif
858 
859  QString result;
860  const auto dirElts = dir.tokenize(QLatin1Char('/'), Qt::SkipEmptyParts);
861  const auto fileElts = file.tokenize(QLatin1Char('/'), Qt::SkipEmptyParts);
862 
863  const auto dend = dirElts.end();
864  const auto fend = fileElts.end();
865  auto dit = dirElts.begin();
866  auto fit = fileElts.begin();
867 
868  const auto eq = [](QStringView lhs, QStringView rhs) {
869  return
870 #if defined(Q_OS_WIN)
871  lhs.compare(rhs, Qt::CaseInsensitive) == 0;
872 #else
873  lhs == rhs;
874 #endif
875  };
876 
877  // std::ranges::mismatch
878  while (dit != dend && fit != fend && eq(*dit, *fit)) {
879  ++dit;
880  ++fit;
881  }
882 
883  while (dit != dend) {
884  result += QLatin1String("../");
885  ++dit;
886  }
887 
888  if (fit != fend) {
889  while (fit != fend) {
890  result += *fit++;
891  result += QLatin1Char('/');
892  }
893  result.chop(1);
894  }
895 
896  if (result.isEmpty())
897  result = QLatin1String(".");
898  return result;
899 }
900 
917 {
918 #if defined(Q_OS_WIN)
919  int i = pathName.indexOf(QLatin1Char('/'));
920  if (i != -1) {
921  QString n(pathName);
922 
923  QChar * const data = n.data();
924  data[i++] = QLatin1Char('\\');
925 
926  for (; i < n.length(); ++i) {
927  if (data[i] == QLatin1Char('/'))
928  data[i] = QLatin1Char('\\');
929  }
930 
931  return n;
932  }
933 #endif
934  return pathName;
935 }
936 
950 {
951 #if defined(Q_OS_WIN)
952  return QFileSystemEntry::removeUncOrLongPathPrefix(pathName).replace(u'\\', u'/');
953 #else
954  return pathName;
955 #endif
956 }
957 
958 static QString qt_cleanPath(const QString &path, bool *ok = nullptr);
959 
971 bool QDir::cd(const QString &dirName)
972 {
973  // Don't detach just yet.
974  const QDirPrivate * const d = d_ptr.constData();
975 
976  if (dirName.isEmpty() || dirName == QLatin1String("."))
977  return true;
978  QString newPath;
979  if (isAbsolutePath(dirName)) {
980  newPath = qt_cleanPath(dirName);
981  } else {
982  newPath = d->dirEntry.filePath();
983  if (!newPath.endsWith(QLatin1Char('/')))
984  newPath += QLatin1Char('/');
985  newPath += dirName;
986  if (dirName.indexOf(QLatin1Char('/')) >= 0
987  || dirName == QLatin1String("..")
988  || d->dirEntry.filePath() == QLatin1String(".")) {
989  bool ok;
990  newPath = qt_cleanPath(newPath, &ok);
991  if (!ok)
992  return false;
993  /*
994  If newPath starts with .., we convert it to absolute to
995  avoid infinite looping on
996 
997  QDir dir(".");
998  while (dir.cdUp())
999  ;
1000  */
1001  if (newPath.startsWith(QLatin1String(".."))) {
1002  newPath = QFileInfo(newPath).absoluteFilePath();
1003  }
1004  }
1005  }
1006 
1007  std::unique_ptr<QDirPrivate> dir(new QDirPrivate(*d_ptr.constData()));
1008  dir->setPath(newPath);
1009  if (!dir->exists())
1010  return false;
1011 
1012  d_ptr = dir.release();
1013  return true;
1014 }
1015 
1027 {
1028  return cd(QString::fromLatin1(".."));
1029 }
1030 
1035 {
1036  const QDirPrivate* d = d_ptr.constData();
1037  return d->nameFilters;
1038 }
1039 
1055 void QDir::setNameFilters(const QStringList &nameFilters)
1056 {
1057  QDirPrivate* d = d_ptr.data();
1058  d->initFileEngine();
1059  d->clearFileLists();
1060 
1061  d->nameFilters = nameFilters;
1062 }
1063 
1064 #ifdef QT_BUILD_CORE_LIB
1085 void QDir::setSearchPaths(const QString &prefix, const QStringList &searchPaths)
1086 {
1087  if (prefix.length() < 2) {
1088  qWarning("QDir::setSearchPaths: Prefix must be longer than 1 character");
1089  return;
1090  }
1091 
1092  for (int i = 0; i < prefix.count(); ++i) {
1093  if (!prefix.at(i).isLetterOrNumber()) {
1094  qWarning("QDir::setSearchPaths: Prefix can only contain letters or numbers");
1095  return;
1096  }
1097  }
1098 
1099  QWriteLocker lock(&QCoreGlobalData::instance()->dirSearchPathsLock);
1101  if (searchPaths.isEmpty()) {
1102  paths.remove(prefix);
1103  } else {
1104  paths.insert(prefix, searchPaths);
1105  }
1106 }
1107 
1115 void QDir::addSearchPath(const QString &prefix, const QString &path)
1116 {
1117  if (path.isEmpty())
1118  return;
1119 
1120  QWriteLocker lock(&QCoreGlobalData::instance()->dirSearchPathsLock);
1122 }
1123 
1131 QStringList QDir::searchPaths(const QString &prefix)
1132 {
1133  QReadLocker lock(&QCoreGlobalData::instance()->dirSearchPathsLock);
1135 }
1136 
1137 #endif // QT_BUILD_CORE_LIB
1138 
1142 QDir::Filters QDir::filter() const
1143 {
1144  const QDirPrivate* d = d_ptr.constData();
1145  return d->filters;
1146 }
1147 
1222 {
1223  QDirPrivate* d = d_ptr.data();
1224  d->initFileEngine();
1225  d->clearFileLists();
1226 
1227  d->filters = filters;
1228 }
1229 
1235 QDir::SortFlags QDir::sorting() const
1236 {
1237  const QDirPrivate* d = d_ptr.constData();
1238  return d->sort;
1239 }
1240 
1278 void QDir::setSorting(SortFlags sort)
1279 {
1280  QDirPrivate* d = d_ptr.data();
1281  d->initFileEngine();
1282  d->clearFileLists();
1283 
1284  d->sort = sort;
1285 }
1286 
1295 {
1296  const QDirPrivate* d = d_ptr.constData();
1297  d->initFileLists(*this);
1298  return d->files.count();
1299 }
1300 
1309 {
1310  const QDirPrivate* d = d_ptr.constData();
1311  d->initFileLists(*this);
1312  return d->files[pos];
1313 }
1314 
1334 QStringList QDir::entryList(Filters filters, SortFlags sort) const
1335 {
1336  const QDirPrivate* d = d_ptr.constData();
1337  return entryList(d->nameFilters, filters, sort);
1338 }
1339 
1340 
1357 QFileInfoList QDir::entryInfoList(Filters filters, SortFlags sort) const
1358 {
1359  const QDirPrivate* d = d_ptr.constData();
1360  return entryInfoList(d->nameFilters, filters, sort);
1361 }
1362 
1379 QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
1380  SortFlags sort) const
1381 {
1382  const QDirPrivate* d = d_ptr.constData();
1383 
1384  if (filters == NoFilter)
1385  filters = d->filters;
1386  if (sort == NoSort)
1387  sort = d->sort;
1388 
1389  if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
1390  d->initFileLists(*this);
1391  return d->files;
1392  }
1393 
1394  QFileInfoList l;
1395  QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
1396  while (it.hasNext())
1397  l.append(it.nextFileInfo());
1398  QStringList ret;
1399  d->sortFileList(sort, l, &ret, nullptr);
1400  return ret;
1401 }
1402 
1420  SortFlags sort) const
1421 {
1422  const QDirPrivate* d = d_ptr.constData();
1423 
1424  if (filters == NoFilter)
1425  filters = d->filters;
1426  if (sort == NoSort)
1427  sort = d->sort;
1428 
1429  if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
1430  d->initFileLists(*this);
1431  return d->fileInfos;
1432  }
1433 
1434  QFileInfoList l;
1435  QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
1436  while (it.hasNext())
1437  l.append(it.nextFileInfo());
1439  d->sortFileList(sort, l, nullptr, &ret);
1440  return ret;
1441 }
1442 
1463 bool QDir::mkdir(const QString &dirName, QFile::Permissions permissions) const
1464 {
1465  const QDirPrivate *d = d_ptr.constData();
1466 
1467  if (dirName.isEmpty()) {
1468  qWarning("QDir::mkdir: Empty or null file name");
1469  return false;
1470  }
1471 
1473  if (!d->fileEngine)
1474  return QFileSystemEngine::createDirectory(QFileSystemEntry(fn), false, permissions);
1475  return d->fileEngine->mkdir(fn, false, permissions);
1476 }
1477 
1485 bool QDir::mkdir(const QString &dirName) const
1486 {
1487  const QDirPrivate* d = d_ptr.constData();
1488 
1489  if (dirName.isEmpty()) {
1490  qWarning("QDir::mkdir: Empty or null file name");
1491  return false;
1492  }
1493 
1495  if (!d->fileEngine)
1497  return d->fileEngine->mkdir(fn, false);
1498 }
1499 
1509 bool QDir::rmdir(const QString &dirName) const
1510 {
1511  const QDirPrivate* d = d_ptr.constData();
1512 
1513  if (dirName.isEmpty()) {
1514  qWarning("QDir::rmdir: Empty or null file name");
1515  return false;
1516  }
1517 
1519  if (!d->fileEngine)
1521 
1522  return d->fileEngine->rmdir(fn, false);
1523 }
1524 
1537 bool QDir::mkpath(const QString &dirPath) const
1538 {
1539  const QDirPrivate* d = d_ptr.constData();
1540 
1541  if (dirPath.isEmpty()) {
1542  qWarning("QDir::mkpath: Empty or null file name");
1543  return false;
1544  }
1545 
1546  QString fn = filePath(dirPath);
1547  if (!d->fileEngine)
1549  return d->fileEngine->mkdir(fn, true);
1550 }
1551 
1563 bool QDir::rmpath(const QString &dirPath) const
1564 {
1565  const QDirPrivate* d = d_ptr.constData();
1566 
1567  if (dirPath.isEmpty()) {
1568  qWarning("QDir::rmpath: Empty or null file name");
1569  return false;
1570  }
1571 
1572  QString fn = filePath(dirPath);
1573  if (!d->fileEngine)
1575  return d->fileEngine->rmdir(fn, true);
1576 }
1577 
1599 {
1600  if (!d_ptr->exists())
1601  return true;
1602 
1603  bool success = true;
1604  const QString dirPath = path();
1605  // not empty -- we must empty it first
1607  while (di.hasNext()) {
1608  const QFileInfo fi = di.nextFileInfo();
1609  const QString &filePath = di.filePath();
1610  bool ok;
1611  if (fi.isDir() && !fi.isSymLink()) {
1612  ok = QDir(filePath).removeRecursively(); // recursive
1613  } else {
1615  if (!ok) { // Read-only files prevent directory deletion on Windows, retry with Write permission.
1616  const QFile::Permissions permissions = QFile::permissions(filePath);
1617  if (!(permissions & QFile::WriteUser))
1619  && QFile::remove(filePath);
1620  }
1621  }
1622  if (!ok)
1623  success = false;
1624  }
1625 
1626  if (success)
1627  success = rmdir(absolutePath());
1628 
1629  return success;
1630 }
1631 
1641 bool QDir::isReadable() const
1642 {
1643  const QDirPrivate* d = d_ptr.constData();
1644 
1645  if (!d->fileEngine) {
1646  if (!d->metaData.hasFlags(QFileSystemMetaData::UserReadPermission))
1648 
1649  return d->metaData.permissions().testAnyFlag(QFile::ReadUser);
1650  }
1651 
1652  const QAbstractFileEngine::FileFlags info =
1653  d->fileEngine->fileFlags(QAbstractFileEngine::DirectoryType
1656  return false;
1657  return info.testAnyFlag(QAbstractFileEngine::ReadUserPerm);
1658 }
1659 
1671 bool QDir::exists() const
1672 {
1673  return d_ptr->exists();
1674 }
1675 
1688 bool QDir::isRoot() const
1689 {
1690  if (!d_ptr->fileEngine)
1691  return d_ptr->dirEntry.isRoot();
1693 }
1694 
1729 bool QDir::isRelative() const
1730 {
1731  if (!d_ptr->fileEngine)
1732  return d_ptr->dirEntry.isRelative();
1733  return d_ptr->fileEngine->isRelativePath();
1734 }
1735 
1736 
1745 {
1746  const QDirPrivate *d = d_ptr.constData();
1747  std::unique_ptr<QDirPrivate> dir;
1748  if (!!d->fileEngine) {
1749  QString absolutePath = d->fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
1751  return false;
1752 
1753  dir.reset(new QDirPrivate(*d_ptr.constData()));
1754  dir->setPath(absolutePath);
1755  } else { // native FS
1756  d->resolveAbsoluteEntry();
1757  dir.reset(new QDirPrivate(*d_ptr.constData()));
1758  dir->setPath(d->absoluteDirEntry.filePath());
1759  }
1760  d_ptr = dir.release(); // actually detach
1761  return true;
1762 }
1763 
1773 bool QDir::operator==(const QDir &dir) const
1774 {
1775  const QDirPrivate *d = d_ptr.constData();
1776  const QDirPrivate *other = dir.d_ptr.constData();
1777 
1778  if (d == other)
1779  return true;
1780  Qt::CaseSensitivity sensitive;
1781  if (!d->fileEngine || !other->fileEngine) {
1782  if (d->fileEngine.get() != other->fileEngine.get()) // one is native, the other is a custom file-engine
1783  return false;
1784 
1786  } else {
1787  if (d->fileEngine->caseSensitive() != other->fileEngine->caseSensitive())
1788  return false;
1789  sensitive = d->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
1790  }
1791 
1792  if (d->filters == other->filters
1793  && d->sort == other->sort
1794  && d->nameFilters == other->nameFilters) {
1795 
1796  // Assume directories are the same if path is the same
1797  if (d->dirEntry.filePath() == other->dirEntry.filePath())
1798  return true;
1799 
1800  if (exists()) {
1801  if (!dir.exists())
1802  return false; //can't be equal if only one exists
1803  // Both exist, fallback to expensive canonical path computation
1804  return canonicalPath().compare(dir.canonicalPath(), sensitive) == 0;
1805  } else {
1806  if (dir.exists())
1807  return false; //can't be equal if only one exists
1808  // Neither exists, compare absolute paths rather than canonical (which would be empty strings)
1809  d->resolveAbsoluteEntry();
1810  other->resolveAbsoluteEntry();
1811  return d->absoluteDirEntry.filePath().compare(other->absoluteDirEntry.filePath(), sensitive) == 0;
1812  }
1813  }
1814  return false;
1815 }
1816 
1822 {
1823  d_ptr = dir.d_ptr;
1824  return *this;
1825 }
1826 
1854 {
1855  if (fileName.isEmpty()) {
1856  qWarning("QDir::remove: Empty or null file name");
1857  return false;
1858  }
1859  return QFile::remove(filePath(fileName));
1860 }
1861 
1878 bool QDir::rename(const QString &oldName, const QString &newName)
1879 {
1880  if (oldName.isEmpty() || newName.isEmpty()) {
1881  qWarning("QDir::rename: Empty or null file name(s)");
1882  return false;
1883  }
1884 
1885  QFile file(filePath(oldName));
1886  if (!file.exists())
1887  return false;
1888  return file.rename(filePath(newName));
1889 }
1890 
1901 bool QDir::exists(const QString &name) const
1902 {
1903  if (name.isEmpty()) {
1904  qWarning("QDir::exists: Empty or null file name");
1905  return false;
1906  }
1907  return QFile::exists(filePath(name));
1908 }
1909 
1923 bool QDir::isEmpty(Filters filters) const
1924 {
1925  const auto d = d_ptr.constData();
1926  QDirIterator it(d->dirEntry.filePath(), d->nameFilters, filters);
1927  return !it.hasNext();
1928 }
1929 
1940 {
1941 #ifdef QT_NO_FSFILEENGINE
1942  return QFileInfoList();
1943 #else
1944  return QFSFileEngine::drives();
1945 #endif
1946 }
1947 
1983 {
1985 }
1986 
2007 {
2009 }
2010 
2056 {
2057  return QFileSystemEngine::homePath();
2058 }
2059 
2086 {
2087  return QFileSystemEngine::tempPath();
2088 }
2089 
2112 {
2113  return QFileSystemEngine::rootPath();
2114 }
2115 
2116 #if QT_CONFIG(regularexpression)
2126 bool QDir::match(const QStringList &filters, const QString &fileName)
2127 {
2128  for (QStringList::ConstIterator sit = filters.constBegin(); sit != filters.constEnd(); ++sit) {
2129  // Insensitive exact match
2131  if (rx.match(fileName).hasMatch())
2132  return true;
2133  }
2134  return false;
2135 }
2136 
2145 bool QDir::match(const QString &filter, const QString &fileName)
2146 {
2147  return match(nameFiltersFromString(filter), fileName);
2148 }
2149 #endif // QT_CONFIG(regularexpression)
2150 
2159 QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormalizations flags, bool *ok)
2160 {
2161  const bool allowUncPaths = flags.testAnyFlag(QDirPrivate::AllowUncPaths);
2162  const bool isRemote = flags.testAnyFlag(QDirPrivate::RemotePath);
2163  const int len = name.length();
2164 
2165  if (ok)
2166  *ok = false;
2167 
2168  if (len == 0)
2169  return name;
2170 
2171  int i = len - 1;
2172  QVarLengthArray<char16_t> outVector(len);
2173  int used = len;
2174  char16_t *out = outVector.data();
2175  const ushort *p = name.utf16();
2176  const ushort *prefix = p;
2177  int up = 0;
2178 
2179  const int prefixLength = rootLength(name, allowUncPaths);
2180  p += prefixLength;
2181  i -= prefixLength;
2182 
2183  // replicate trailing slash (i > 0 checks for emptiness of input string p)
2184  // except for remote paths because there can be /../ or /./ ending
2185  if (i > 0 && p[i] == '/' && !isRemote) {
2186  out[--used] = '/';
2187  --i;
2188  }
2189 
2190  auto isDot = [](const ushort *p, int i) {
2191  return i > 1 && p[i - 1] == '.' && p[i - 2] == '/';
2192  };
2193  auto isDotDot = [](const ushort *p, int i) {
2194  return i > 2 && p[i - 1] == '.' && p[i - 2] == '.' && p[i - 3] == '/';
2195  };
2196 
2197  while (i >= 0) {
2198  // copy trailing slashes for remote urls
2199  if (p[i] == '/') {
2200  if (isRemote && !up) {
2201  if (isDot(p, i)) {
2202  i -= 2;
2203  continue;
2204  }
2205  out[--used] = p[i];
2206  }
2207 
2208  --i;
2209  continue;
2210  }
2211 
2212  // remove current directory
2213  if (p[i] == '.' && (i == 0 || p[i-1] == '/')) {
2214  --i;
2215  continue;
2216  }
2217 
2218  // detect up dir
2219  if (i >= 1 && p[i] == '.' && p[i-1] == '.' && (i < 2 || p[i - 2] == '/')) {
2220  ++up;
2221  i -= i >= 2 ? 3 : 2;
2222 
2223  if (isRemote) {
2224  // moving up should consider empty path segments too (/path//../ -> /path/)
2225  while (i > 0 && up && p[i] == '/') {
2226  --up;
2227  --i;
2228  }
2229  }
2230  continue;
2231  }
2232 
2233  // prepend a slash before copying when not empty
2234  if (!up && used != len && out[used] != '/')
2235  out[--used] = '/';
2236 
2237  // skip or copy
2238  while (i >= 0) {
2239  if (p[i] == '/') {
2240  // copy all slashes as is for remote urls if they are not part of /./ or /../
2241  if (isRemote && !up) {
2242  while (i > 0 && p[i] == '/' && !isDotDot(p, i)) {
2243 
2244  if (isDot(p, i)) {
2245  i -= 2;
2246  continue;
2247  }
2248 
2249  out[--used] = p[i];
2250  --i;
2251  }
2252 
2253  // in case of /./, jump over
2254  if (isDot(p, i))
2255  i -= 2;
2256 
2257  break;
2258  }
2259 
2260  --i;
2261  break;
2262  }
2263 
2264  // actual copy
2265  if (!up)
2266  out[--used] = p[i];
2267  --i;
2268  }
2269 
2270  // decrement up after copying/skipping
2271  if (up)
2272  --up;
2273  }
2274 
2275  // Indicate failure when ".." are left over for an absolute path.
2276  if (ok)
2277  *ok = prefixLength == 0 || up == 0;
2278 
2279  // add remaining '..'
2280  while (up && !isRemote) {
2281  if (used != len && out[used] != '/') // is not empty and there isn't already a '/'
2282  out[--used] = '/';
2283  out[--used] = '.';
2284  out[--used] = '.';
2285  --up;
2286  }
2287 
2288  bool isEmpty = used == len;
2289 
2290  if (prefixLength) {
2291  if (!isEmpty && out[used] == '/') {
2292  // Even though there is a prefix the out string is a slash. This happens, if the input
2293  // string only consists of a prefix followed by one or more slashes. Just skip the slash.
2294  ++used;
2295  }
2296  for (int i = prefixLength - 1; i >= 0; --i)
2297  out[--used] = prefix[i];
2298  } else {
2299  if (isEmpty) {
2300  // After resolving the input path, the resulting string is empty (e.g. "foo/.."). Return
2301  // a dot in that case.
2302  out[--used] = '.';
2303  } else if (out[used] == '/') {
2304  // After parsing the input string, out only contains a slash. That happens whenever all
2305  // parts are resolved and there is a trailing slash ("./" or "foo/../" for example).
2306  // Prepend a dot to have the correct return value.
2307  out[--used] = '.';
2308  }
2309  }
2310 
2311  // If path was not modified return the original value
2312  if (used == 0)
2313  return name;
2314  return QString::fromUtf16(out + used, len - used);
2315 }
2316 
2317 static QString qt_cleanPath(const QString &path, bool *ok)
2318 {
2319  if (path.isEmpty()) {
2320  Q_ASSERT(!ok); // The only caller passing ok knows its path is non-empty
2321  return path;
2322  }
2323 
2326 
2327  // Strip away last slash except for root directories
2328  if (ret.length() > 1 && ret.endsWith(QLatin1Char('/'))) {
2329 #if defined (Q_OS_WIN)
2330  if (!(ret.length() == 3 && ret.at(1) == QLatin1Char(':')))
2331 #endif
2332  ret.chop(1);
2333  }
2334 
2335  return ret;
2336 }
2337 
2351 {
2352  return qt_cleanPath(path);
2353 }
2354 
2365 {
2366  return QFileInfo(path).isRelative();
2367 }
2368 
2372 void QDir::refresh() const
2373 {
2374  QDirPrivate *d = const_cast<QDir*>(this)->d_ptr.data();
2375  d->metaData.clear();
2376  d->initFileEngine();
2377  d->clearFileLists();
2378 }
2379 
2383 QDirPrivate* QDir::d_func()
2384 {
2385  return d_ptr.data();
2386 }
2387 
2396 {
2397  return QDirPrivate::splitFilters(nameFilter);
2398 }
2399 
2453 #ifndef QT_NO_DEBUG_STREAM
2455 {
2456  QDebugStateSaver save(debug);
2457  debug.resetFormat();
2459  if (filters == QDir::NoFilter) {
2460  flags << QLatin1String("NoFilter");
2461  } else {
2462  if (filters & QDir::Dirs) flags << QLatin1String("Dirs");
2463  if (filters & QDir::AllDirs) flags << QLatin1String("AllDirs");
2464  if (filters & QDir::Files) flags << QLatin1String("Files");
2465  if (filters & QDir::Drives) flags << QLatin1String("Drives");
2466  if (filters & QDir::NoSymLinks) flags << QLatin1String("NoSymLinks");
2467  if (filters & QDir::NoDot) flags << QLatin1String("NoDot");
2468  if (filters & QDir::NoDotDot) flags << QLatin1String("NoDotDot");
2469  if ((filters & QDir::AllEntries) == QDir::AllEntries) flags << QLatin1String("AllEntries");
2470  if (filters & QDir::Readable) flags << QLatin1String("Readable");
2471  if (filters & QDir::Writable) flags << QLatin1String("Writable");
2472  if (filters & QDir::Executable) flags << QLatin1String("Executable");
2473  if (filters & QDir::Modified) flags << QLatin1String("Modified");
2474  if (filters & QDir::Hidden) flags << QLatin1String("Hidden");
2475  if (filters & QDir::System) flags << QLatin1String("System");
2476  if (filters & QDir::CaseSensitive) flags << QLatin1String("CaseSensitive");
2477  }
2478  debug.noquote() << "QDir::Filters(" << flags.join(QLatin1Char('|')) << ')';
2479  return debug;
2480 }
2481 
2482 static QDebug operator<<(QDebug debug, QDir::SortFlags sorting)
2483 {
2484  QDebugStateSaver save(debug);
2485  debug.resetFormat();
2486  if (sorting == QDir::NoSort) {
2487  debug << "QDir::SortFlags(NoSort)";
2488  } else {
2489  QString type;
2490  if ((sorting & QDir::SortByMask) == QDir::Name) type = QLatin1String("Name");
2491  if ((sorting & QDir::SortByMask) == QDir::Time) type = QLatin1String("Time");
2492  if ((sorting & QDir::SortByMask) == QDir::Size) type = QLatin1String("Size");
2493  if ((sorting & QDir::SortByMask) == QDir::Unsorted) type = QLatin1String("Unsorted");
2494 
2496  if (sorting & QDir::DirsFirst) flags << QLatin1String("DirsFirst");
2497  if (sorting & QDir::DirsLast) flags << QLatin1String("DirsLast");
2498  if (sorting & QDir::IgnoreCase) flags << QLatin1String("IgnoreCase");
2499  if (sorting & QDir::LocaleAware) flags << QLatin1String("LocaleAware");
2500  if (sorting & QDir::Type) flags << QLatin1String("Type");
2501  debug.noquote() << "QDir::SortFlags(" << type << '|' << flags.join(QLatin1Char('|')) << ')';
2502  }
2503  return debug;
2504 }
2505 
2507 {
2508  QDebugStateSaver save(debug);
2509  debug.resetFormat();
2510  debug << "QDir(" << dir.path() << ", nameFilters = {"
2511  << dir.nameFilters().join(QLatin1Char(','))
2512  << "}, "
2513  << dir.sorting()
2514  << ','
2515  << dir.filter()
2516  << ')';
2517  return debug;
2518 }
2519 #endif // QT_NO_DEBUG_STREAM
2520 
small capitals from c petite p scientific f u
Definition: afcover.h:88
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
The QChar class provides a 16-bit Unicode character.
Definition: qchar.h:84
constexpr bool isLetterOrNumber() const noexcept
Definition: qchar.h:503
constexpr bool isNull() const noexcept
Definition: qchar.h:494
operator<<(QDataStream &ds, qfloat16 f)
Definition: qfloat16.cpp:327
The QDateTime class provides date and time functions.
Definition: qdatetime.h:238
qint64 msecsTo(const QDateTime &) const
Definition: qdatetime.cpp:4616
void setTimeSpec(Qt::TimeSpec spec)
Definition: qdatetime.cpp:3994
The QDebug class provides an output stream for debugging information.
Definition: qdebug.h:65
Convenience class for custom QDebug operators.
Definition: qdebug.h:176
The QDir class provides access to directory structures and their contents.
Definition: qdir.h:55
bool mkdir(const QString &dirName) const
Definition: qdir.cpp:1485
bool remove(const QString &fileName)
Definition: qdir.cpp:1853
QDir(const QDir &)
Definition: qdir.cpp:602
QStringList entryList(Filters filters=NoFilter, SortFlags sort=NoSort) const
Definition: qdir.cpp:1334
~QDir()
Definition: qdir.cpp:611
QString operator[](int) const
Definition: qdir.cpp:1308
bool cdUp()
Definition: qdir.cpp:1026
bool isRelative() const
Definition: qdir.cpp:1729
QString dirName() const
Definition: qdir.cpp:704
bool operator==(const QDir &dir) const
Definition: qdir.cpp:1773
QDir & operator=(const QDir &)
Definition: qdir.cpp:1821
static bool isAbsolutePath(const QString &path)
Definition: qdir.h:211
SortFlags sorting() const
Definition: qdir.cpp:1235
void refresh() const
Definition: qdir.cpp:2372
static QStringList nameFiltersFromString(const QString &nameFilter)
Definition: qdir.cpp:2395
bool removeRecursively()
Definition: qdir.cpp:1598
bool rmpath(const QString &dirPath) const
Definition: qdir.cpp:1563
static bool isRelativePath(const QString &path)
Definition: qdir.cpp:2364
QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition: qdir.cpp:2454
static QString fromNativeSeparators(const QString &pathName)
Definition: qdir.cpp:949
static bool setCurrent(const QString &path)
Definition: qdir.cpp:1982
QString path() const
Definition: qdir.cpp:646
static void setSearchPaths(const QString &prefix, const QStringList &searchPaths)
uint count() const
Definition: qdir.cpp:1294
bool cd(const QString &dirName)
Definition: qdir.cpp:971
static QStringList searchPaths(const QString &prefix)
QString canonicalPath() const
Definition: qdir.cpp:683
bool rename(const QString &oldName, const QString &newName)
Definition: qdir.cpp:1878
QSharedDataPointer< QDirPrivate > d_ptr
Definition: qdir.h:265
void setSorting(SortFlags sort)
Definition: qdir.cpp:1278
QString absolutePath() const
Definition: qdir.cpp:660
static void addSearchPath(const QString &prefix, const QString &path)
QFileInfoList entryInfoList(Filters filters=NoFilter, SortFlags sort=NoSort) const
Definition: qdir.cpp:1357
bool exists() const
Definition: qdir.cpp:1671
bool mkpath(const QString &dirPath) const
Definition: qdir.cpp:1537
static QFileInfoList drives()
Definition: qdir.cpp:1939
static QString tempPath()
Definition: qdir.cpp:2085
QString filePath(const QString &fileName) const
Definition: qdir.cpp:765
bool makeAbsolute()
Definition: qdir.cpp:1744
void setFilter(Filters filter)
Definition: qdir.cpp:1221
static QString cleanPath(const QString &path)
Definition: qdir.cpp:2350
void setPath(const QString &path)
Definition: qdir.cpp:631
void setNameFilters(const QStringList &nameFilters)
Definition: qdir.cpp:1055
QString relativeFilePath(const QString &fileName) const
Definition: qdir.cpp:831
static QString toNativeSeparators(const QString &pathName)
Definition: qdir.cpp:916
QString absoluteFilePath(const QString &fileName) const
Definition: qdir.cpp:796
@ Size
Definition: qdir.h:87
@ IgnoreCase
Definition: qdir.h:93
@ SortByMask
Definition: qdir.h:89
@ DirsLast
Definition: qdir.h:94
@ Unsorted
Definition: qdir.h:88
@ Time
Definition: qdir.h:86
@ DirsFirst
Definition: qdir.h:91
@ Name
Definition: qdir.h:85
@ Type
Definition: qdir.h:96
@ NoSort
Definition: qdir.h:97
@ Reversed
Definition: qdir.h:92
@ LocaleAware
Definition: qdir.h:95
bool isReadable() const
Definition: qdir.cpp:1641
static QString homePath()
Definition: qdir.cpp:2055
bool isEmpty(Filters filters=Filters(AllEntries|NoDotAndDotDot)) const
Definition: qdir.cpp:1923
bool isRoot() const
Definition: qdir.cpp:1688
static QString currentPath()
Definition: qdir.cpp:2006
static QString rootPath()
Definition: qdir.cpp:2111
Filters filter() const
Definition: qdir.cpp:1142
bool rmdir(const QString &dirName) const
Definition: qdir.cpp:1509
QStringList nameFilters() const
Definition: qdir.cpp:1034
@ Executable
Definition: qdir.h:66
@ CaseSensitive
Definition: qdir.h:76
@ Files
Definition: qdir.h:58
@ Modified
Definition: qdir.h:69
@ Hidden
Definition: qdir.h:70
@ AllEntries
Definition: qdir.h:61
@ Drives
Definition: qdir.h:59
@ AllDirs
Definition: qdir.h:75
@ NoSymLinks
Definition: qdir.h:60
@ NoDotDot
Definition: qdir.h:78
@ NoFilter
Definition: qdir.h:81
@ Readable
Definition: qdir.h:64
@ Writable
Definition: qdir.h:65
@ System
Definition: qdir.h:71
@ NoDotAndDotDot
Definition: qdir.h:79
@ NoDot
Definition: qdir.h:77
@ Dirs
Definition: qdir.h:57
The QDirIterator class provides an iterator for directory entrylists.
Definition: qdiriterator.h:49
bool hasNext() const
QFileInfo nextFileInfo()
QString filePath() const
static void sortFileList(QDir::SortFlags, QFileInfoList &, QStringList *, QFileInfoList *)
Definition: qdir.cpp:321
void resolveAbsoluteEntry() const
Definition: qdir.cpp:212
@ AllowUncPaths
Definition: qdir_p.h:66
@ DefaultNormalization
Definition: qdir_p.h:65
@ RemotePath
Definition: qdir_p.h:67
static QChar getFilterSepChar(const QString &nameFilter)
Definition: qdir.cpp:166
std::unique_ptr< QAbstractFileEngine > fileEngine
Definition: qdir_p.h:103
void initFileEngine()
Definition: qdir.cpp:363
void setPath(const QString &path)
Definition: qdir.cpp:186
void clearFileLists()
Definition: qdir.cpp:205
QFileSystemEntry dirEntry
Definition: qdir_p.h:105
QFileSystemEntry absoluteDirEntry
Definition: qdir_p.h:106
QFileSystemMetaData metaData
Definition: qdir_p.h:107
QFileInfoList fileInfos
Definition: qdir_p.h:97
QStringList files
Definition: qdir_p.h:96
QDir::SortFlags sort
Definition: qdir_p.h:100
void initFileLists(const QDir &dir) const
Definition: qdir.cpp:351
bool exists() const
Definition: qdir.cpp:149
bool fileListsInitialized
Definition: qdir_p.h:95
QStringList nameFilters
Definition: qdir_p.h:99
QDirPrivate(const QString &path, const QStringList &nameFilters_=QStringList(), QDir::SortFlags sort_=QDir::SortFlags(QDir::Name|QDir::IgnoreCase), QDir::Filters filters_=QDir::AllEntries)
Definition: qdir.cpp:115
static QStringList splitFilters(const QString &nameFilter, QChar sep={})
Definition: qdir.cpp:176
bool operator()(const QDirSortItem &, const QDirSortItem &) const
Definition: qdir.cpp:249
QDirSortItemComparator(QDir::SortFlags flags)
Definition: qdir.cpp:245
static QFileInfoList drives()
The QFile class provides an interface for reading from and writing to files.
Definition: qfile.h:94
bool setPermissions(Permissions permissionSpec) override
Definition: qfile.cpp:1152
bool remove()
Definition: qfile.cpp:444
Permissions permissions() const override
Definition: qfile.cpp:1123
bool rename(const QString &newName)
Definition: qfile.cpp:558
bool exists() const
Definition: qfile.cpp:376
The QFileInfo class provides system-independent file information.
Definition: qfileinfo.h:57
QDateTime lastModified() const
Definition: qfileinfo.h:186
bool isSymLink() const
Definition: qfileinfo.cpp:1100
QString suffix() const
Definition: qfileinfo.cpp:877
QString fileName() const
Definition: qfileinfo.cpp:772
QString absoluteFilePath() const
Definition: qfileinfo.cpp:556
bool isDir() const
Definition: qfileinfo.cpp:1048
qint64 size() const
Definition: qfileinfo.cpp:1403
bool isRelative() const
Definition: qfileinfo.cpp:664
static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data)
static QAbstractFileEngine * resolveEntryAndCreateLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data)
static bool setCurrentPath(const QFileSystemEntry &entry)
static bool fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data, QFileSystemMetaData::MetaDataFlags what)
static bool createDirectory(const QFileSystemEntry &entry, bool createParents, std::optional< QFile::Permissions > permissions=std::nullopt)
static QFileSystemEntry absoluteName(const QFileSystemEntry &entry)
static bool isCaseSensitive()
static bool removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents)
static QFileSystemEntry currentPath()
bool isEmpty() const
bool isClean() const
bool isRelative() const
bool isRoot() const
QString filePath() const
bool isAbsolute() const
bool remove(const Key &key)
Definition: qhash.h:911
T value(const Key &key) const noexcept
Definition: qhash.h:997
The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal.
Definition: qstring.h:84
void append(parameter_type t)
Definition: qlist.h:469
void clear()
Definition: qlist.h:445
const_iterator ConstIterator
Definition: qlist.h:280
The QReadLocker class is a convenience class that simplifies locking and unlocking read-write locks f...
static QRegularExpression fromWildcard(QStringView pattern, Qt::CaseSensitivity cs=Qt::CaseInsensitive, WildcardConversionOptions options=DefaultWildcardConversion)
The QScopedArrayPointer class stores a pointer to a dynamically allocated array of objects,...
T * data() const noexcept
The QSharedData class is a base class for shared data objects. \reentrant.
Definition: qshareddata.h:55
const T * constData() const noexcept
Definition: qshareddata.h:87
The QString class provides a Unicode character string.
Definition: qstring.h:388
qsizetype count() const
Definition: qstring.h:414
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition: qstring.cpp:5092
QString & replace(qsizetype i, qsizetype len, QChar after)
Definition: qstring.cpp:3450
static QString fromLatin1(QByteArrayView ba)
Definition: qstring.cpp:5488
static QString fromUtf16(const char16_t *, qsizetype size=-1)
Definition: qstring.cpp:5658
const QChar * constData() const
Definition: qstring.h:1234
bool isNull() const
Definition: qstring.h:1078
qsizetype size() const
Definition: qstring.h:413
const QChar at(qsizetype i) const
Definition: qstring.h:1212
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition: qstring.cpp:5143
bool isEmpty() const
Definition: qstring.h:1216
int compare(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition: qstring.cpp:6263
QString toLower() const &
Definition: qstring.h:611
QString left(qsizetype n) const
Definition: qstring.cpp:4951
static QString static QString qsizetype indexOf(QChar c, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition: qstring.cpp:4197
int localeAwareCompare(const QString &s) const
Definition: qstring.cpp:6403
QString & remove(qsizetype i, qsizetype len)
Definition: qstring.cpp:3252
auto tokenize(Needle &&needle, Flags...flags) const &noexcept(noexcept(qTokenize(std::declval< const QString & >(), std::forward< Needle >(needle), flags...))) -> decltype(qTokenize(*this, std::forward< Needle >(needle), flags...))
Definition: qstring.h:714
qsizetype length() const
Definition: qstring.h:415
The QStringList class provides a list of strings.
The QStringView class provides a unified view on UTF-16 strings with a read-only subset of the QStrin...
Definition: qstringview.h:122
int compare(QStringView other, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition: qstringview.h:304
T * data() noexcept
The QWriteLocker class is a convenience class that simplifies locking and unlocking read-write locks ...
float rx
double e
backing_store_ptr info
[4]
Definition: jmemsys.h:161
@ UTC
Definition: qnamespace.h:1261
CaseSensitivity
Definition: qnamespace.h:1282
@ CaseInsensitive
Definition: qnamespace.h:1283
@ CaseSensitive
Definition: qnamespace.h:1284
@ SkipEmptyParts
Definition: qnamespace.h:153
#define QString()
Definition: parse-defines.h:51
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld endif[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1 beq endif SRC MASK if dst_r_bpp DST_R else add endif PF add sub src_basereg pixdeinterleave mask_basereg pixdeinterleave dst_r_basereg process_pixblock_head pixblock_size cache_preload_simple process_pixblock_tail pixinterleave dst_w_basereg irp beq endif process_pixblock_tail_head tst beq irp if pixblock_size chunk_size tst beq pixld SRC pixld MASK if DST_R else pixld DST_R endif if
#define Q_UNLIKELY(x)
#define Q_LIKELY(x)
QList< QString > QStringList
Definition: qcontainerfwd.h:64
@ OSSupportsUncPaths
Definition: qdir.cpp:89
QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormalizations flags, bool *ok)
Definition: qdir.cpp:2159
QList< QFileInfo > QFileInfoList
Definition: qfileinfo.h:207
unsigned int uint
Definition: qglobal.h:334
long long qint64
Definition: qglobal.h:298
unsigned short ushort
Definition: qglobal.h:333
#define qWarning
Definition: qlogging.h:179
GLenum type
Definition: qopengl.h:270
GLboolean r
[2]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei const GLuint * paths
GLbitfield flags
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
GLfloat n
const GLubyte * c
Definition: qopenglext.h:12701
GLuint GLuint * names
Definition: qopenglext.h:5654
GLenum GLsizei len
Definition: qopenglext.h:3292
GLsizei const GLchar *const * path
Definition: qopenglext.h:4283
GLuint64EXT * result
[6]
Definition: qopenglext.h:10932
GLfloat GLfloat p
[1]
Definition: qopenglext.h:12698
#define Q_ASSERT(cond)
Definition: qrandom.cpp:84
constexpr auto qTokenize(Haystack &&h, Needle &&n, Flags...flags) noexcept(QtPrivate::Tok::is_nothrow_constructible_from< Haystack, Needle >::value) -> decltype(QtPrivate::Tok::TokenizerResult< Haystack, Needle >{std::forward< Haystack >(h), std::forward< Needle >(n), flags...})
QFile file
[0]
QFileInfo fi("c:/temp/foo")
[newstuff]
QTextStream out(stdout)
[7]
QReadWriteLock lock
[0]
QSharedPointer< T > other(t)
[5]
QString dir
[11]
const QStringList filters({"Image files (*.png *.xpm *.jpg)", "Text files (*.txt)", "Any files (*)" })
[6]
QGraphicsItem * item
QStringList::Iterator it
static QCoreGlobalData * instance()
QHash< QString, QStringList > dirSearchPaths
QFileInfo item
Definition: qdir.cpp:237
QString suffix_cache
Definition: qdir.cpp:236
QString filename_cache
Definition: qdir.cpp:235
The QLatin1Char class provides an 8-bit ASCII/Latin-1 character.
Definition: qchar.h:53
#define rhs
int fn(int &i)