diff options
Diffstat (limited to 'src/corelib/io/qdir.cpp')
-rw-r--r-- | src/corelib/io/qdir.cpp | 136 |
1 files changed, 75 insertions, 61 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 09315f9afe..eb55696ccf 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -57,13 +57,13 @@ enum { }; // Return the length of the root part of an absolute path, for use by cleanPath(), cd(). -static int rootLength(const QString &name, bool allowUncPaths) +static qsizetype rootLength(QStringView name, bool allowUncPaths) { - const int len = name.length(); + const qsizetype len = name.size(); // starts with double slash if (allowUncPaths && name.startsWith("//"_L1)) { // Server name '//server/path' is part of the prefix. - const int nextSlash = name.indexOf(u'/', 2); + const qsizetype nextSlash = name.indexOf(u'/', 2); return nextSlash >= 0 ? nextSlash + 1 : len; } #if defined(Q_OS_WIN) @@ -132,7 +132,7 @@ bool QDirPrivate::exists() const inline QChar QDirPrivate::getFilterSepChar(const QString &nameFilter) { QChar sep(u';'); - int i = nameFilter.indexOf(sep, 0); + qsizetype i = nameFilter.indexOf(sep, 0); if (i == -1 && nameFilter.indexOf(u' ', 0) != -1) sep = QChar(u' '); return sep; @@ -153,12 +153,12 @@ inline void QDirPrivate::setPath(const QString &path) { QString p = QDir::fromNativeSeparators(path); if (p.endsWith(u'/') - && p.length() > 1 + && p.size() > 1 #if defined(Q_OS_WIN) && (!(p.length() == 3 && p.at(1).unicode() == ':' && p.at(0).isLetter())) #endif ) { - p.truncate(p.length() - 1); + p.truncate(p.size() - 1); } dirEntry = QFileSystemEntry(p, QFileSystemEntry::FromInternalPath()); @@ -288,7 +288,7 @@ inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QFileInfoList &l, QStringList *names, QFileInfoList *infos) { // names and infos are always empty lists or 0 here - int n = l.size(); + qsizetype n = l.size(); if (n > 0) { if (n == 1 || (sort & QDir::SortByMask) == QDir::Unsorted) { if (infos) @@ -299,16 +299,16 @@ inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QFileInfoList &l, } } else { QScopedArrayPointer<QDirSortItem> si(new QDirSortItem[n]); - for (int i = 0; i < n; ++i) + for (qsizetype i = 0; i < n; ++i) si[i].item = l.at(i); std::sort(si.data(), si.data() + n, QDirSortItemComparator(sort)); // put them back in the list(s) if (infos) { - for (int i = 0; i < n; ++i) + for (qsizetype i = 0; i < n; ++i) infos->append(si[i].item); } if (names) { - for (int i = 0; i < n; ++i) + for (qsizetype i = 0; i < n; ++i) names->append(si[i].item.fileName()); } } @@ -507,6 +507,10 @@ inline void QDirPrivate::initFileEngine() \snippet qdir-listfiles/main.cpp 0 + \section1 Platform Specific Issues + + \include android-content-uri-limitations.qdocinc + \sa QFileInfo, QFile, QFileDialog, QCoreApplication::applicationDirPath(), {Find Files Example} */ @@ -611,7 +615,7 @@ void QDir::setPath(const QString &path) */ QString QDir::path() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); return d->dirEntry.filePath(); } @@ -625,9 +629,13 @@ QString QDir::path() const */ QString QDir::absolutePath() const { - const QDirPrivate* d = d_ptr.constData(); - d->resolveAbsoluteEntry(); - return d->absoluteDirEntry.filePath(); + Q_D(const QDir); + if (!d->fileEngine) { + d->resolveAbsoluteEntry(); + return d->absoluteDirEntry.filePath(); + } + + return d->fileEngine->fileName(QAbstractFileEngine::AbsoluteName); } /*! @@ -648,7 +656,7 @@ QString QDir::absolutePath() const */ QString QDir::canonicalPath() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (!d->fileEngine) { QFileSystemEntry answer = QFileSystemEngine::canonicalName(d->dirEntry, d->metaData); return answer.filePath(); @@ -669,17 +677,19 @@ QString QDir::canonicalPath() const */ QString QDir::dirName() const { - const QDirPrivate* d = d_ptr.constData(); - return d->dirEntry.fileName(); + Q_D(const QDir); + if (!d_ptr->fileEngine) + return d->dirEntry.fileName(); + return d->fileEngine->fileName(QAbstractFileEngine::BaseName); } #ifdef Q_OS_WIN -static int drivePrefixLength(const QString &path) +static qsizetype drivePrefixLength(QStringView path) { // Used to extract path's drive for use as prefix for an "absolute except for drive" path - const int size = path.length(); - int drive = 2; // length of drive prefix + const qsizetype size = path.size(); + qsizetype drive = 2; // length of drive prefix if (size > 1 && path.at(1).unicode() == ':') { if (Q_UNLIKELY(!path.at(0).isLetter())) return 0; @@ -691,7 +701,7 @@ static int drivePrefixLength(const QString &path) drive++; if (drive >= size) { qWarning("Base directory starts with neither a drive nor a UNC share: %s", - qUtf8Printable(QDir::toNativeSeparators(path))); + qUtf8Printable(QDir::toNativeSeparators(path.toString()))); return 0; } while (drive < size && path.at(drive).unicode() != '/') @@ -733,7 +743,7 @@ QString QDir::filePath(const QString &fileName) const if (treatAsAbsolute(fileName)) return fileName; - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); QString ret = d->dirEntry.filePath(); if (fileName.isEmpty()) return ret; @@ -741,7 +751,7 @@ QString QDir::filePath(const QString &fileName) const #ifdef Q_OS_WIN if (fileName.startsWith(u'/') || fileName.startsWith(u'\\')) { // Handle the "absolute except for drive" case (i.e. \blah not c:\blah): - const int drive = drivePrefixLength(ret); + const qsizetype drive = drivePrefixLength(ret); return drive > 0 ? QStringView{ret}.left(drive) % fileName : fileName; } #endif // Q_OS_WIN @@ -764,7 +774,7 @@ QString QDir::absoluteFilePath(const QString &fileName) const if (treatAsAbsolute(fileName)) return fileName; - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); d->resolveAbsoluteEntry(); const QString absoluteDirPath = d->absoluteDirEntry.filePath(); if (fileName.isEmpty()) @@ -773,7 +783,7 @@ QString QDir::absoluteFilePath(const QString &fileName) const // Handle the "absolute except for drive" case (i.e. \blah not c:\blah): if (fileName.startsWith(u'/') || fileName.startsWith(u'\\')) { // Combine absoluteDirPath's drive with fileName - const int drive = drivePrefixLength(absoluteDirPath); + const qsizetype drive = drivePrefixLength(absoluteDirPath); if (Q_LIKELY(drive)) return QStringView{absoluteDirPath}.left(drive) % fileName; @@ -883,7 +893,7 @@ QString QDir::relativeFilePath(const QString &fileName) const QString QDir::toNativeSeparators(const QString &pathName) { #if defined(Q_OS_WIN) - int i = pathName.indexOf(u'/'); + qsizetype i = pathName.indexOf(u'/'); if (i != -1) { QString n(pathName); @@ -988,6 +998,9 @@ bool QDir::cd(const QString &dirName) otherwise returns \c false. Note that the logical cdUp() operation is not performed if the new directory does not exist. + \note On Android, this is not supported for content URIs. For more information, + see \l {Android: DocumentFile.getParentFile()}{DocumentFile.getParentFile()}. + \sa cd(), isReadable(), exists(), path() */ bool QDir::cdUp() @@ -1000,7 +1013,7 @@ bool QDir::cdUp() */ QStringList QDir::nameFilters() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); return d->nameFilters; } @@ -1021,7 +1034,7 @@ QStringList QDir::nameFilters() const */ void QDir::setNameFilters(const QStringList &nameFilters) { - QDirPrivate* d = d_ptr.data(); + Q_D(QDir); d->initFileEngine(); d->clearFileLists(); @@ -1051,12 +1064,12 @@ void QDir::setNameFilters(const QStringList &nameFilters) */ void QDir::setSearchPaths(const QString &prefix, const QStringList &searchPaths) { - if (prefix.length() < 2) { + if (prefix.size() < 2) { qWarning("QDir::setSearchPaths: Prefix must be longer than 1 character"); return; } - for (int i = 0; i < prefix.length(); ++i) { + for (int i = 0; i < prefix.size(); ++i) { if (!prefix.at(i).isLetterOrNumber()) { qWarning("QDir::setSearchPaths: Prefix can only contain letters or numbers"); return; @@ -1108,7 +1121,7 @@ QStringList QDir::searchPaths(const QString &prefix) */ QDir::Filters QDir::filter() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); return d->filters; } @@ -1187,7 +1200,7 @@ QDir::Filters QDir::filter() const */ void QDir::setFilter(Filters filters) { - QDirPrivate* d = d_ptr.data(); + Q_D(QDir); d->initFileEngine(); d->clearFileLists(); @@ -1201,7 +1214,7 @@ void QDir::setFilter(Filters filters) */ QDir::SortFlags QDir::sorting() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); return d->sort; } @@ -1244,7 +1257,7 @@ QDir::SortFlags QDir::sorting() const */ void QDir::setSorting(SortFlags sort) { - QDirPrivate* d = d_ptr.data(); + Q_D(QDir); d->initFileEngine(); d->clearFileLists(); @@ -1260,9 +1273,9 @@ void QDir::setSorting(SortFlags sort) */ uint QDir::count() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); d->initFileLists(*this); - return d->files.count(); + return d->files.size(); } /*! @@ -1274,7 +1287,7 @@ uint QDir::count() const */ QString QDir::operator[](int pos) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); d->initFileLists(*this); return d->files[pos]; } @@ -1300,7 +1313,7 @@ QString QDir::operator[](int pos) const */ QStringList QDir::entryList(Filters filters, SortFlags sort) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); return entryList(d->nameFilters, filters, sort); } @@ -1323,7 +1336,7 @@ QStringList QDir::entryList(Filters filters, SortFlags sort) const */ QFileInfoList QDir::entryInfoList(Filters filters, SortFlags sort) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); return entryInfoList(d->nameFilters, filters, sort); } @@ -1346,7 +1359,7 @@ QFileInfoList QDir::entryInfoList(Filters filters, SortFlags sort) const QStringList QDir::entryList(const QStringList &nameFilters, Filters filters, SortFlags sort) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (filters == NoFilter) filters = d->filters; @@ -1386,7 +1399,7 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters, QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filters, SortFlags sort) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (filters == NoFilter) filters = d->filters; @@ -1429,7 +1442,7 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter */ bool QDir::mkdir(const QString &dirName, QFile::Permissions permissions) const { - const QDirPrivate *d = d_ptr.constData(); + Q_D(const QDir); if (dirName.isEmpty()) { qWarning("QDir::mkdir: Empty or null file name"); @@ -1451,7 +1464,7 @@ bool QDir::mkdir(const QString &dirName, QFile::Permissions permissions) const */ bool QDir::mkdir(const QString &dirName) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (dirName.isEmpty()) { qWarning("QDir::mkdir: Empty or null file name"); @@ -1475,7 +1488,7 @@ bool QDir::mkdir(const QString &dirName) const */ bool QDir::rmdir(const QString &dirName) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (dirName.isEmpty()) { qWarning("QDir::rmdir: Empty or null file name"); @@ -1503,7 +1516,7 @@ bool QDir::rmdir(const QString &dirName) const */ bool QDir::mkpath(const QString &dirPath) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (dirPath.isEmpty()) { qWarning("QDir::mkpath: Empty or null file name"); @@ -1529,7 +1542,7 @@ bool QDir::mkpath(const QString &dirPath) const */ bool QDir::rmpath(const QString &dirPath) const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (dirPath.isEmpty()) { qWarning("QDir::rmpath: Empty or null file name"); @@ -1607,7 +1620,7 @@ bool QDir::removeRecursively() */ bool QDir::isReadable() const { - const QDirPrivate* d = d_ptr.constData(); + Q_D(const QDir); if (!d->fileEngine) { if (!d->metaData.hasFlags(QFileSystemMetaData::UserReadPermission)) @@ -1710,7 +1723,7 @@ bool QDir::isRelative() const */ bool QDir::makeAbsolute() { - const QDirPrivate *d = d_ptr.constData(); + Q_D(const QDir); std::unique_ptr<QDirPrivate> dir; if (!!d->fileEngine) { QString absolutePath = d->fileEngine->fileName(QAbstractFileEngine::AbsoluteName); @@ -1739,7 +1752,7 @@ bool QDir::makeAbsolute() */ bool QDir::operator==(const QDir &dir) const { - const QDirPrivate *d = d_ptr.constData(); + Q_D(const QDir); const QDirPrivate *other = dir.d_ptr.constData(); if (d == other) @@ -1889,7 +1902,7 @@ bool QDir::exists(const QString &name) const */ bool QDir::isEmpty(Filters filters) const { - const auto d = d_ptr.constData(); + Q_D(const QDir); QDirIterator it(d->dirEntry.filePath(), d->nameFilters, filters); return !it.hasNext(); } @@ -1898,7 +1911,8 @@ bool QDir::isEmpty(Filters filters) const Returns a list of the root directories on this system. On Windows this returns a list of QFileInfo objects containing "C:/", - "D:/", etc. On other operating systems, it returns a list containing + "D:/", etc. This does not return drives with ejectable media that are empty. + On other operating systems, it returns a list containing just one root directory (i.e. "/"). \sa root(), rootPath() @@ -2127,7 +2141,7 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza { const bool allowUncPaths = flags.testAnyFlag(QDirPrivate::AllowUncPaths); const bool isRemote = flags.testAnyFlag(QDirPrivate::RemotePath); - const int len = name.length(); + const qsizetype len = name.size(); if (ok) *ok = false; @@ -2135,15 +2149,15 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza if (len == 0) return name; - int i = len - 1; + qsizetype i = len - 1; QVarLengthArray<char16_t> outVector(len); - int used = len; + qsizetype used = len; char16_t *out = outVector.data(); const ushort *p = reinterpret_cast<const ushort *>(name.data()); const ushort *prefix = p; - int up = 0; + qsizetype up = 0; - const int prefixLength = rootLength(name, allowUncPaths); + const qsizetype prefixLength = rootLength(name, allowUncPaths); p += prefixLength; i -= prefixLength; @@ -2154,10 +2168,10 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza --i; } - auto isDot = [](const ushort *p, int i) { + auto isDot = [](const ushort *p, qsizetype i) { return i > 1 && p[i - 1] == '.' && p[i - 2] == '/'; }; - auto isDotDot = [](const ushort *p, int i) { + auto isDotDot = [](const ushort *p, qsizetype i) { return i > 2 && p[i - 1] == '.' && p[i - 2] == '.' && p[i - 3] == '/'; }; @@ -2260,7 +2274,7 @@ QString qt_normalizePathSegments(const QString &name, QDirPrivate::PathNormaliza // string only consists of a prefix followed by one or more slashes. Just skip the slash. ++used; } - for (int i = prefixLength - 1; i >= 0; --i) + for (qsizetype i = prefixLength - 1; i >= 0; --i) out[--used] = prefix[i]; } else { if (isEmpty) { @@ -2292,7 +2306,7 @@ static QString qt_cleanPath(const QString &path, bool *ok) QString ret = qt_normalizePathSegments(name, OSSupportsUncPaths ? QDirPrivate::AllowUncPaths : QDirPrivate::DefaultNormalization, ok); // Strip away last slash except for root directories - if (ret.length() > 1 && ret.endsWith(u'/')) { + if (ret.size() > 1 && ret.endsWith(u'/')) { #if defined (Q_OS_WIN) if (!(ret.length() == 3 && ret.at(1) == u':')) #endif @@ -2338,7 +2352,7 @@ bool QDir::isRelativePath(const QString &path) */ void QDir::refresh() const { - QDirPrivate *d = const_cast<QDir*>(this)->d_ptr.data(); + QDirPrivate *d = const_cast<QDir *>(this)->d_func(); d->metaData.clear(); d->initFileEngine(); d->clearFileLists(); |