5#ifndef QFILESYSTEMMETADATA_P_H
6#define QFILESYSTEMMETADATA_P_H
19#include "qplatformdefs.h"
20#include <QtCore/qglobal.h>
21#include <QtCore/qdatetime.h>
22#include <QtCore/qtimezone.h>
23#include <QtCore/private/qabstractfileengine_p.h>
27# include <QtCore/qt_windows.h>
28# ifndef IO_REPARSE_TAG_SYMLINK
29# define IO_REPARSE_TAG_SYMLINK (0xA000000CL
)
39class QFileSystemEngine;
51 OtherReadPermission = 0x00000004, OtherWritePermission = 0x00000002, OtherExecutePermission = 0x00000001,
52 GroupReadPermission = 0x00000040, GroupWritePermission = 0x00000020, GroupExecutePermission = 0x00000010,
53 UserReadPermission = 0x00000400, UserWritePermission = 0x00000200, UserExecutePermission = 0x00000100,
54 OwnerReadPermission = 0x00004000, OwnerWritePermission = 0x00002000, OwnerExecutePermission = 0x00001000,
56 OtherPermissions = OtherReadPermission | OtherWritePermission | OtherExecutePermission,
57 GroupPermissions = GroupReadPermission | GroupWritePermission | GroupExecutePermission,
58 UserPermissions = UserReadPermission | UserWritePermission | UserExecutePermission,
59 OwnerPermissions = OwnerReadPermission | OwnerWritePermission | OwnerExecutePermission,
61 ReadPermissions = OtherReadPermission | GroupReadPermission | UserReadPermission | OwnerReadPermission,
62 WritePermissions = OtherWritePermission | GroupWritePermission | UserWritePermission | OwnerWritePermission,
63 ExecutePermissions = OtherExecutePermission | GroupExecutePermission | UserExecutePermission | OwnerExecutePermission,
65 Permissions = OtherPermissions | GroupPermissions | UserPermissions | OwnerPermissions,
68 LinkType = 0x00010000,
69 FileType = 0x00020000,
70 DirectoryType = 0x00040000,
71#if defined(Q_OS_DARWIN)
72 BundleType = 0x00080000,
73 AliasType = 0x08000000,
79 JunctionType = 0x04000000,
80 WinLnkType = 0x08000000,
85 SequentialType = 0x00800000,
87 LegacyLinkType = LinkType | AliasType | WinLnkType,
89 Type = LinkType | FileType | DirectoryType | BundleType | SequentialType | AliasType,
92 HiddenAttribute = 0x00100000,
93 SizeAttribute = 0x00200000,
94 ExistsAttribute = 0x00400000,
96 WasDeletedAttribute = 0x0,
98 WasDeletedAttribute = 0x40000000,
101 Attributes = HiddenAttribute | SizeAttribute | ExistsAttribute | WasDeletedAttribute,
104 AccessTime = 0x02000000,
105 BirthTime = 0x02000000,
106 MetadataChangeTime = 0x02000000,
107 ModificationTime = 0x02000000,
109 Times = AccessTime | BirthTime | MetadataChangeTime | ModificationTime,
113 GroupId = 0x20000000,
115 CaseSensitive = 0x80000000,
117 OwnerIds = UserId | GroupId,
119 PosixStatFlags = OtherPermissions
126 | WasDeletedAttribute
131 WinStatFlags = FileType
139 AllMetaDataFlags = 0xFFFFFFFF
142 Q_DECLARE_FLAGS(MetaDataFlags, MetaDataFlag)
144 bool hasFlags(MetaDataFlags flags)
const
146 return ((knownFlagsMask & flags) == flags);
149 MetaDataFlags missingFlags(MetaDataFlags flags)
151 return flags & ~knownFlagsMask;
159 void clearFlags(MetaDataFlags flags = AllMetaDataFlags)
161 knownFlagsMask &= ~flags;
164 bool exists()
const {
return entryFlags.testAnyFlag(ExistsAttribute); }
166 bool isLink()
const {
return entryFlags.testAnyFlag(LinkType); }
167 bool isFile()
const {
return entryFlags.testAnyFlag(FileType); }
168 bool isDirectory()
const {
return entryFlags.testAnyFlag(DirectoryType); }
169 bool isBundle()
const;
170 bool isAlias()
const;
171 bool isLegacyLink()
const {
return entryFlags.testAnyFlag(LegacyLinkType); }
172 bool isSequential()
const {
return entryFlags.testAnyFlag(SequentialType); }
173 bool isHidden()
const {
return entryFlags.testAnyFlag(HiddenAttribute); }
174 bool wasDeleted()
const {
return entryFlags.testAnyFlag(WasDeletedAttribute); }
176 bool isLnkFile()
const {
return entryFlags.testAnyFlag(WinLnkType); }
177 bool isJunction()
const {
return entryFlags.testAnyFlag(JunctionType); }
179 bool isLnkFile()
const {
return false; }
180 bool isJunction()
const {
return false; }
183 qint64 size()
const {
return size_; }
185 inline QFile::Permissions permissions()
const;
188 inline void setPermissions(QFile::Permissions permissions);
190 QDateTime accessTime()
const;
191 QDateTime birthTime()
const;
192 QDateTime metadataChangeTime()
const;
193 QDateTime modificationTime()
const;
195 QDateTime fileTime(QFile::FileTime time)
const;
197 uint groupId()
const;
198 uint ownerId(QAbstractFileEngine::FileOwner owner)
const;
200 bool isReadable()
const {
return permissions().testAnyFlags(QFile::ReadUser); }
201 bool isWritable()
const {
return permissions().testAnyFlags(QFile::WriteUser); }
202 bool isExecutable()
const {
return permissions().testAnyFlags(QFile::ExeUser); }
205 void fillFromStatxBuf(
const struct statx &statBuffer);
206 void fillFromStatBuf(
const QT_STATBUF &statBuffer);
207 void fillFromDirEnt(
const QT_DIRENT &statBuffer);
211 inline void fillFromFileAttribute(DWORD fileAttribute,
bool isDriveRoot =
false);
212 inline void fillFromFindData(WIN32_FIND_DATA &findData,
bool setLinkType =
false,
bool isDriveRoot =
false);
213 inline void fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo);
216 friend class QFileSystemEngine;
218 MetaDataFlags knownFlagsMask;
219 MetaDataFlags entryFlags;
225 DWORD fileAttribute_;
227 FILETIME changeTime_;
228 FILETIME lastAccessTime_;
229 FILETIME lastWriteTime_;
232 qint64 accessTime_ = 0;
233 qint64 birthTime_ = 0;
234 qint64 metadataChangeTime_ = 0;
235 qint64 modificationTime_ = 0;
237 uint userId_ = (uint) -2;
238 uint groupId_ = (uint) -2;
243Q_DECLARE_OPERATORS_FOR_FLAGS(QFileSystemMetaData::MetaDataFlags)
245inline QFile::Permissions QFileSystemMetaData::permissions()
const {
return QFile::Permissions::fromInt((Permissions & entryFlags).toInt()); }
247void QFileSystemMetaData::setPermissions(QFile::Permissions permissions)
249 entryFlags &= ~Permissions;
250 entryFlags |= MetaDataFlag(uint(permissions.toInt()));
251 knownFlagsMask |= Permissions;
254#if defined(Q_OS_DARWIN)
255inline bool QFileSystemMetaData::isBundle()
const {
return entryFlags.testAnyFlag(BundleType); }
256inline bool QFileSystemMetaData::isAlias()
const {
return entryFlags.testAnyFlag(AliasType); }
258inline bool QFileSystemMetaData::isBundle()
const {
return false; }
259inline bool QFileSystemMetaData::isAlias()
const {
return false; }
262#if defined(Q_OS_UNIX) || defined (Q_OS_WIN)
263inline QDateTime QFileSystemMetaData::fileTime(QFile::FileTime time)
const
266 case QFile::FileModificationTime:
267 return modificationTime();
269 case QFile::FileAccessTime:
272 case QFile::FileBirthTime:
275 case QFile::FileMetadataChangeTime:
276 return metadataChangeTime();
283#if defined(Q_OS_UNIX)
284inline QDateTime QFileSystemMetaData::birthTime()
const
287 ? QDateTime::fromMSecsSinceEpoch(birthTime_, QTimeZone::UTC)
290inline QDateTime QFileSystemMetaData::metadataChangeTime()
const
292 return metadataChangeTime_
293 ? QDateTime::fromMSecsSinceEpoch(metadataChangeTime_, QTimeZone::UTC)
296inline QDateTime QFileSystemMetaData::modificationTime()
const
298 return modificationTime_
299 ? QDateTime::fromMSecsSinceEpoch(modificationTime_, QTimeZone::UTC)
302inline QDateTime QFileSystemMetaData::accessTime()
const
305 ? QDateTime::fromMSecsSinceEpoch(accessTime_, QTimeZone::UTC)
309inline uint QFileSystemMetaData::userId()
const {
return userId_; }
310inline uint QFileSystemMetaData::groupId()
const {
return groupId_; }
312inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner)
const
314 if (owner == QAbstractFileEngine::OwnerUser)
322inline uint QFileSystemMetaData::userId()
const {
return (uint) -2; }
323inline uint QFileSystemMetaData::groupId()
const {
return (uint) -2; }
324inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner)
const
326 if (owner == QAbstractFileEngine::OwnerUser)
332inline void QFileSystemMetaData::fillFromFileAttribute(DWORD fileAttribute,
bool isDriveRoot)
334 fileAttribute_ = fileAttribute;
336 if (!isDriveRoot && (fileAttribute_ & FILE_ATTRIBUTE_HIDDEN))
337 entryFlags |= HiddenAttribute;
338 entryFlags |= ((fileAttribute & FILE_ATTRIBUTE_DIRECTORY) ? DirectoryType: FileType);
339 entryFlags |= ExistsAttribute;
340 knownFlagsMask |= FileType | DirectoryType | HiddenAttribute | ExistsAttribute;
343 knownFlagsMask |= WinLnkType;
346inline void QFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData,
bool setLinkType,
bool isDriveRoot)
348 fillFromFileAttribute(findData.dwFileAttributes, isDriveRoot);
349 birthTime_ = findData.ftCreationTime;
350 lastAccessTime_ = findData.ftLastAccessTime;
351 changeTime_ = lastWriteTime_ = findData.ftLastWriteTime;
352 if (fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) {
355 size_ = findData.nFileSizeHigh;
357 size_ += findData.nFileSizeLow;
359 knownFlagsMask |= Times | SizeAttribute;
361 knownFlagsMask |= LinkType;
362 entryFlags &= ~LinkType;
363 if (fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
364 if (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) {
365 entryFlags |= LinkType;
366#if defined(IO_REPARSE_TAG_MOUNT_POINT)
367 }
else if ((fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY)
368 && (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) {
369 entryFlags |= JunctionType;
376inline void QFileSystemMetaData::fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo)
378 fillFromFileAttribute(fileInfo.dwFileAttributes);
379 birthTime_ = fileInfo.ftCreationTime;
380 lastAccessTime_ = fileInfo.ftLastAccessTime;
381 changeTime_ = lastWriteTime_ = fileInfo.ftLastWriteTime;
382 if (fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) {
385 size_ = fileInfo.nFileSizeHigh;
387 size_ += fileInfo.nFileSizeLow;
389 knownFlagsMask |= Times | SizeAttribute;
QDirPrivate(const QDirPrivate ©)
void clearCache(MetaDataClearing mode)
void initFileLists(const QDir &dir) const
QString resolveAbsoluteEntry() const
bool operator()(const QDirSortItem &, const QDirSortItem &) const
QDirSortItemComparator(QDir::SortFlags flags, QCollator *coll=nullptr)
int compareStrings(const QString &a, const QString &b, Qt::CaseSensitivity cs) const
static void appendIfMatchesNonDirListingFlags(const QDirListing::DirEntry &dirEntry, QDir::Filters filters, QFileInfoList &l)
static qsizetype rootLength(QStringView name, QDirPrivate::PathNormalizations flags)
static bool qt_cleanPath(QString *path)
bool comparesEqual(const QDir &lhs, const QDir &rhs)
static bool treatAsAbsolute(const QString &path)
static bool checkPermissions(const QDirListing::DirEntry &dirEntry, QDir::Filters filters)
bool qt_normalizePathSegments(QString *path, QDirPrivate::PathNormalizations flags)
static bool checkDotOrDotDot(const QDirListing::DirEntry &dirEntry, QDir::Filters filters)
Q_AUTOTEST_EXPORT bool qt_normalizePathSegments(QString *path, QDirPrivate::PathNormalizations flags)
QDirSortItem(const QFileInfo &fi, QDir::SortFlags sort)