1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// Copyright (C) 2016 The Qt Company Ltd.
// Copyright (C) 2024 Ahmad Samir <a.samirh78@gmail.com>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDILISTING_H
#define QDILISTING_H
#include <QtCore/qdir.h>
#include <iterator>
#include <memory>
QT_BEGIN_NAMESPACE
class QDirListingPrivate;
class Q_CORE_EXPORT QDirListing
{
public:
enum class IteratorFlag {
NoFlag = 0x0,
FollowSymlinks = 0x1,
Recursive = 0x2
};
Q_DECLARE_FLAGS(IteratorFlags, IteratorFlag)
QDirListing(const QDir &dir, IteratorFlags flags = IteratorFlag::NoFlag);
QDirListing(const QString &path, IteratorFlags flags = IteratorFlag::NoFlag);
QDirListing(const QString &path, QDir::Filters filter,
IteratorFlags flags = IteratorFlag::NoFlag);
QDirListing(const QString &path, const QStringList &nameFilters,
QDir::Filters filters = QDir::NoFilter,
IteratorFlags flags = IteratorFlag::NoFlag);
~QDirListing();
QString iteratorPath() const;
class Q_CORE_EXPORT DirEntry
{
friend class QDirListing;
QDirListingPrivate *dirListPtr = nullptr;
public:
QString fileName() const;
QString baseName() const;
QString completeBaseName() const;
QString suffix() const;
QString bundleName() const;
QString completeSuffix() const;
QString filePath() const;
bool isDir() const;
bool isFile() const;
bool isSymLink() const;
bool exists() const;
bool isHidden() const;
bool isReadable() const;
bool isWritable() const;
bool isExecutable() const;
QFileInfo fileInfo() const;
QString canonicalFilePath() const;
QString absoluteFilePath() const;
QString absolutePath() const;
qint64 size() const;
QDateTime birthTime(const QTimeZone &tz) const { return fileTime(QFile::FileBirthTime, tz); }
QDateTime metadataChangeTime(const QTimeZone &tz) const { return fileTime(QFile::FileMetadataChangeTime, tz); }
QDateTime lastModified(const QTimeZone &tz) const { return fileTime(QFile::FileModificationTime, tz); }
QDateTime lastRead(const QTimeZone &tz) const { return fileTime(QFile::FileAccessTime, tz); }
QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz) const;
};
class const_iterator
{
friend class QDirListing;
const_iterator(QDirListingPrivate *dp) : dirListPtr(dp) { dirEntry.dirListPtr = dp; }
QDirListingPrivate *dirListPtr = nullptr;
DirEntry dirEntry;
public:
using iterator_category = std::input_iterator_tag;
using value_type = DirEntry;
using difference_type = qint64;
using pointer = const value_type *;
using reference = const value_type &;
const_iterator() = default;
reference operator*() const { return dirEntry; }
pointer operator->() const { return &dirEntry; }
Q_CORE_EXPORT const_iterator &operator++();
const_iterator operator++(int) { auto tmp = *this; operator++(); return tmp; };
friend bool operator==(const const_iterator &lhs, const const_iterator &rhs)
{
// This is only used for the sentinel end iterator
return lhs.dirListPtr == nullptr && rhs.dirListPtr == nullptr;
}
friend bool operator!=(const const_iterator &lhs, const const_iterator &rhs)
{ return !(lhs == rhs); }
};
const_iterator begin() const;
const_iterator cbegin() const { return begin(); }
const_iterator end() const { return {}; }
const_iterator cend() const { return end(); }
// Qt compatibility
const_iterator constBegin() const { return begin(); }
const_iterator constEnd() const { return end(); }
private:
Q_DISABLE_COPY(QDirListing)
std::unique_ptr<QDirListingPrivate> d;
friend class QDir;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDirListing::IteratorFlags)
QT_END_NAMESPACE
#endif // QDILISTING_H
|