Qt文件系统源码分析—第二篇QFileInfo

深度

本文主要分析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类书写方式适合场景是导出接口稳定、不想公开内部实现细节、内部能够灵活修改

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

QFileInfo

作用

获取文件的相关属性

使用示例

#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;

}

主要函数调用流程及原理

QFileInfo::absolutePath

获取文件目录的绝对路径,此函数仅字符串操作。将目标路径通过分割符计算出目录位置,如果本身为目录,获取上一级目录。

QFileInfo::absoluteFilePath

获取文件的绝对路径,此函数仅字符串操作

QFileInfo::completeSuffix

获取文件的后缀名。注意为了兼容,第一个“.”以后都是后缀

QFileInfo::group

获取文件所属用户组,windows下无效

QFileInfo::isDir

文件是否为目录

QFileInfo::isFile

目标路径是否为文件

QFileInfo中关于路径文件名操作大都是字符串操作

获取文件属性的都是通过QFileSystemEngine::fillMetaData调用GetFileAttributesEx获取

写到最后

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

猜你喜欢

转载自blog.csdn.net/sinat_36391009/article/details/130718932