天天看點

QT中檔案及檔案夾詳細資訊擷取

在QT中擷取檔案或目錄資訊時可以通過QFileInfo或者QDir來擷取,但是在QT提供的方法中提供了大量名稱相近的方法,容易引起誤會,是以在此做了一個總結,以免每次用起來的時候都要去看QT官方簡單而又晦澀的文檔。

這裡以Windows下的檔案系統為例作代碼展示,首先準備幾個檔案,分别代表檔案、檔案的快捷方式、複雜檔案字尾的檔案及檔案夾等,分别如下:

檔案或檔案夾名 說明
C:/javafx-src.zip.lnk 為” C:/Java/jdk1.8.0_281/javafx-src.zip”的快捷方式
C:/Java/jdk1.8.0_281/javafx-src.zip 檔案
D:/AI_Python/project.tar.gz 複雜檔案字尾,即.tar.gz
C:/Qt/Qt5.14.2 目錄

首先建立上述檔案或檔案夾,對于檔案的話不要求檔案的具體内容,但是檔案和檔案夾必須存在。

相關代碼如下:

/**
 * @brief FileInfoDemo 展示QFileInfo有關的詳細資訊
 * @param fileInfo QFileInfo執行個體
 */
void FileInfoDemo(QFileInfo& fileInfo)
{
    qDebug() << "absoluteFilePath:" << fileInfo.absoluteFilePath();
    qDebug() << "absolutePath:" << fileInfo.absolutePath();
    qDebug() << "baseName:" << fileInfo.baseName();
    qDebug() << "bundleName:" << fileInfo.bundleName();
    qDebug() << "canonicalFilePath:" << fileInfo.canonicalFilePath();
    qDebug() << "canonicalPath:" << fileInfo.canonicalPath();
    qDebug() << "completeBaseName:" << fileInfo.completeBaseName();
    qDebug() << "completeSuffix:" << fileInfo.completeSuffix();
    qDebug() << "fileName:" << fileInfo.fileName();
    qDebug() << "filePath:" << fileInfo.filePath();
    qDebug() << "path:" << fileInfo.path();
    qDebug() << "suffix:" << fileInfo.suffix();
    qDebug() << "symLinkTarget:" << fileInfo.symLinkTarget();
    qDebug() << "size:" << fileInfo.size();
}

/**
 * @brief DirDemo 展示QDir有關的詳細資訊
 * @param dir QDir執行個體
 */
void DirDemo(QDir& dir)
{
    qDebug() << "absolutePath:" << dir.absolutePath();
    qDebug() << "baseName:" << dir.dirName();
    qDebug() << "canonicalPath:" << dir.canonicalPath();
    qDebug() << "path:" << dir.path();
}      

調用的代碼如下:

//C:/javafx-src.zip.lnk是檔案C:/Java/jdk1.8.0_281/javafx-src.zip的快捷方式
    QFileInfo fileinfo("C:/javafx-src.zip.lnk");
    FileInfoDemo(fileinfo);

    fileinfo.setFile("C:/Java/jdk1.8.0_281/javafx-src.zip");
    FileInfoDemo(fileinfo);

    fileinfo.setFile("D:/AI_Python/project.tar.gz");
    FileInfoDemo(fileinfo);

    fileinfo.setFile("C:/Qt/Qt5.14.2");
    FileInfoDemo(fileinfo);

    QDir dir("C:/Qt/Qt5.14.2");
DirDemo(dir);      

最終的輸出如下:

absoluteFilePath
absolutePath C:/ C:/Java/jdk1.8.0_281 D:/AI_Python C:/Qt
baseName javafx-src project Qt5
bundleName
canonicalFilePath
canonicalPath
completeBaseName javafx-src.zip project.tar Qt5.14
completeSuffix zip.lnk zip tar.gz 14.2
fileName javafx-src.zip.lnk project.tar.gz Qt5.14.2
filePath
path
suffix lnk gz 2
symLinkTarget
size 5226868 932927547

下面對上面的屬性做詳細說明:

屬性名 屬性說明
對于檔案、快捷方式檔案、檔案夾均為該檔案的包含檔案名的全實體路徑。
對于檔案、快捷方式檔案、檔案夾均為該檔案所在的檔案夾的全實體路徑。
對于檔案、快捷方式檔案、檔案夾均為不包含任何檔案字尾的檔案名。
僅适用于MacOS和iOS系統,其它平台均傳回空字元串。
對于快捷方式檔案來說傳回快捷方式所指向的檔案的absoluteFilePath,對于普通檔案、檔案夾為目前檔案的absoluteFilePath。
對于快捷方式檔案來說傳回快捷方式所指向的檔案的absolutePath,對于普通檔案、檔案夾為目前檔案的absolutePath。
檔案不包含suffix的名字,如” javafx-src.zip”傳回” javafx-src”,” javafx-src.zip.lnk”傳回” javafx-src.zip”,如果是檔案夾則傳回檔案夾的名稱
對于檔案來說傳回的是檔案的完整字尾,如” javafx-src.zip”傳回” zip”,” project.tar.gz”傳回” tar.gz”,如果是檔案夾則傳回值沒有任何意義(雖然在本執行個體中有傳回值)
對于檔案來說傳回的是不包含檔案路徑的名稱,對于檔案夾則是不包含檔案夾路徑的檔案夾名稱
等同于absoluteFilePath,均為全實體路徑
等同于absolutePath,均為父級檔案夾的全路徑
對于檔案來說傳回的是檔案的最後一個字尾,如” javafx-src.zip”傳回” zip”,” project.tar.gz”傳回” gz”,如果是檔案夾則傳回值沒有任何意義(雖然在本執行個體中有傳回值)
對于快捷方式檔案來說傳回快捷方式所指向的檔案的absoluteFilePath,對于普通檔案、檔案夾均為空。
對于快捷方式檔案來說傳回快捷方式所指向的檔案的檔案體積,對于普通檔案為目前檔案的體積,對于檔案夾則為空。

題外話,QT的API說明文檔跟Java和C#的API相比差了一些,一些相近的方法(功能相近或者參數相近)的說明語焉不詳,更不提沒有中文文檔了,是以有的時候想要弄清楚方法之間的異同之處,需要看源代碼和編寫驗證代碼來證明自己的想法。這大概跟公司的體量有關系吧。

繼續閱讀