您现在的位置是:首页 >技术交流 >Qt文件系统源码分析—第三篇QDir网站首页技术交流

Qt文件系统源码分析—第三篇QDir

魂恒 2024-06-17 11:26:43
简介Qt文件系统源码分析—第三篇QDir

深度

本文主要分析Windows平台,Mac、Linux暂不涉及

本文只分析到Win32 API/Windows Com组件/STL库函数层次,再下层代码不做探究

本文QT版本5.15.2

类关系图

QTemporaryFile继承QFile

QFile、QSaveFile继承QFileDevice

QFileDevice继承QIODevice

QIODevice、QFileSystemWatcher继承QObject

QLockFile、QFileInfo、QDir、QFileSelector无任何继承关系

QObject中有一指向QObjectData指针d_ptr。d_ptr是保护成员变量,这意味着每个子类可以修改d_ptr内容。在QObject中d_ptr指向QObjectPrivate,

QIODevice中d_ptr指向QIODevicePrivate

QFileDevice中d_ptr指向QFileDevicePrivate

QFile中d_ptr指向QFilePrivate

QTemporaryFile中d_ptr指向QTemporaryFilePrivate

QFileInfo、QDir、QLockFile不继承QObject,因此没有指向QObjectData指针d_ptr。但是各自同样声明了d_ptr变量指向各自的private类

QFileInfo中d_ptr指向QFileInfoPrivate

QDir中d_ptr指向QDirPrivate

QLockFile中d_ptr指向QLockFilePrivate

启发:

这种Private类书写方式适合场景是导出接口稳定、不想公开内部实现细节、内部能够灵活修改

可以用在付费插件、软件逆向等使用场景

QDir

作用

提供对目录结构及其内容的访问

使用示例

#include <QDir>

int main(int argc, char* argv[])

{

QDir h("D:");

auto h2 = QDir::toNativeSeparators("D:/");

auto h3 = QDir::cleanPath("D:");

auto listFileInfo = h.entryInfoList(QStringList()<<"*", QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System, QDir::DirsFirst);

auto listFileName = h.entryList(QStringList() << "*", QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System, QDir::DirsFirst);

return 0;

}

#include <QFileInfo>

#include <QDir>

#include <QDateTime>

#include <QDebug>

int main(int argc, char* argv[])

{

QFileInfo file("D:/1.txt");

file.absoluteDir();

file.absolutePath();

file.fileName();

file.absoluteFilePath();

file.absolutePath();

file.baseName();

file.birthTime();

file.caching();

file.bundleName();

file.canonicalFilePath();

file.canonicalPath();

file.completeBaseName();

file.completeSuffix();

file.created();

file.dir();

file.exists();

file.fileName();

file.filePath();

file.group();

file.groupId();

file.isAbsolute();

file.isBundle();

file.isDir();

file.isExecutable();

file.isFile();

file.isReadable();

file.isRelative();

file.isRoot();

file.isHidden();

file.isNativePath();

file.isShortcut();

file.isSymLink();

file.isWritable();

file.lastModified();

file.lastRead();

file.makeAbsolute();

file.owner();

file.ownerId();

file.path();

file.permissions();

file.refresh();

return 0;

}

主要函数调用流程及原理

目录及导航操作:

QDir::path

返回设置的路径

QFileSystemEntry在Qt中代表具有路径的实体,文件夹、文件都为一个实体。里面存储着实体的路径名称信息。

QDir::setPath

设置QDir路径

QDir::absolutePath

来获得目录的绝对路径。

QDir::dirName

该方法返回绝对路径中的最后一个项目,即目录名,但如果QDir关联的是当前工作目录,则返回"."。

QDir::mkdir

创建目录,如果父目录不存在会失败

具体实现是win32 API函数CreateDirectory

QDir::mkpath

创建目录,会将未创建的父目录一起创建

QDir::rmdir

删除目录,目录必须为空

QDir::rmpath

删除目录,目录必须为空,并且还会将空的父目录给删除

最后依旧是调用的RemoveDirectory

QDir::removeRecursively

删除目录,包括其所有内容。

对于目录使用QDir::rmdir,对于文件使用QFile::remove

QDir::refresh

刷新目录内容。

QDir::cd

跳转当前QDir目录

QDir::exists

QDir::rename

QDir::remove

QDir::count

当前目录及其他特定目录

QDir::home

QDir::homePath

通过OpenProcessToken打开进程当前用户根目录

QDir::root

QDir::rootPath

QDir::temp

QDir::tempPath

QDir::current

QDir::currentPath

QDir::drives

文件匹配查找

QDir::match

寻找满足匹配规则的文件夹、目录。此函数先遍历获取文件名、目录名再运用三方库pcre2进行字符串匹配,以下是主要调用流程

QDir::entryList

同样是通过QDirPrivate::initFileLists调用三方库进行字符串匹配

写到最后

目前先写到这,诸位无论是有什么意见或建议都可以写到评论区,下来一起探讨

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。