天天看點

Qt檔案系統源碼分析—第二篇QFileInfo

作者:嗷嗚笨

深度

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

本文隻分析到Win32 API/Windows Com元件/STL庫函數層次,再下層代碼不做探究

本文QT版本5.15.2

類關系圖

Qt檔案系統源碼分析—第二篇QFileInfo

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

擷取檔案目錄的絕對路徑,此函數僅字元串操作。将目标路徑通過分割符計算出目錄位置,如果本身為目錄,擷取上一級目錄。

Qt檔案系統源碼分析—第二篇QFileInfo

QFileInfo::absoluteFilePath

擷取檔案的絕對路徑,此函數僅字元串操作

Qt檔案系統源碼分析—第二篇QFileInfo

QFileInfo::completeSuffix

擷取檔案的字尾名。注意為了相容,第一個“.”以後都是字尾

QFileInfo::group

擷取檔案所屬使用者組,windows下無效

Qt檔案系統源碼分析—第二篇QFileInfo

QFileInfo::isDir

檔案是否為目錄

Qt檔案系統源碼分析—第二篇QFileInfo

QFileInfo::isFile

目标路徑是否為檔案

Qt檔案系統源碼分析—第二篇QFileInfo

QFileInfo中關于路徑檔案名操作大都是字元串操作

Qt檔案系統源碼分析—第二篇QFileInfo

擷取檔案屬性的都是通過QFileSystemEngine::fillMetaData調用GetFileAttributesEx擷取

Qt檔案系統源碼分析—第二篇QFileInfo

寫到最後

目前先寫到這,諸位無論是有什麼意見或建議都可以寫到評論區,下來一起探讨