您现在的位置是:首页 >技术交流 >Qt文件系统源码分析—第三篇QDir网站首页技术交流
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调用三方库进行字符串匹配
写到最后
目前先写到这,诸位无论是有什么意见或建议都可以写到评论区,下来一起探讨