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