部分內容來自:https://blog.csdn.net/Amnes1a/article/details/65444966
QFileInfo簡介
QFileInfo類爲我們提供了系統無關的文件信息,包括文件的名字和在文件系統中位置,文件的訪問權限,是否是目錄或符合鏈接等等。並且,通過這個類,可以修改文件的大小和最後修改、讀取時間。同時,QFileInfo類也可以用來取到Qt 資源的相關信息。
QFileInfo可以表示絕對路徑或相對路徑的文件。其中,絕對路徑就是以"/"開始的路徑(或者在Windows系統上就是以某個盤符開始的路徑)。相對路徑就是相對於當前工作目錄的一個文件或目錄。我們在開發中可以使用該類的成員函數isRelative() 來判斷一個QFileInfo表示的是一個相對路徑還是一個絕對路徑,也可以使用makeAbsolute()將一個相對路徑轉換爲一個絕對路徑。
可以使用exists() 函數判斷一個文件是否存在,使用size()函數獲取文件的大小。成員函數isFile()、isDir()、isSymLink() 可以判斷文件的類型(普通文件、目錄或是符號鏈接)。
若QFileInfo當前代表的是一個符號鏈接,symLinkTarget() 函數返回符號鏈接所指向的文件。在Unix平臺上,包括macOS和iOS,符號鏈接和它所指向的文件具有同樣的大小,因爲Unix透明的看待普通文件和符號鏈接;同樣,打開一個符號鏈接進行讀寫時,其實是打開了它所指向的真實文件。例如:
#ifdef Q_OS_UNIX
QFileInfo info1("/home/bob/bin/untabify");
info1.isSymLink(); // returns true
info1.absoluteFilePath(); // returns "/home/bob/bin/untabify"
info1.size(); // returns 56201
info1.symLinkTarget(); // returns "/opt/pretty++/bin/untabify"
QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "/opt/pretty++/bin/untabify"
info2.size(); // returns 56201
#endif
在Windows平臺上,符號鏈接是 .lnk 文件,也就是快捷方式。此時,size() 函數返回的是符號鏈接本身的大小,同樣,打開一個 .lnk 文件就是打開 .lnk 文件本身,並不是打開它所指向的真實文件。例如:
#ifdef Q_OS_WIN
QFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk");
info1.isSymLink(); // returns true
info1.absoluteFilePath(); // returns "C:/Documents and Settings/Bob/untabify.lnk"
info1.size(); // returns 743
info1.symLinkTarget(); // returns "C:/Pretty++/untabify"
QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "C:/Pretty++/untabify"
info2.size(); // returns 63942
#endif
擴展
-
若QFileInfo代表的是目錄,則QFileInfo不會自動在路徑後添加一個"/"。如果你需要這個"/",需要自己手動添加。
-
在NTFS文件系統上,特別是Windows,出於性能考慮,文件的所有權和權限檢查在默認情況下是被禁用的。要使能這個功能,可以在文件中添加下面這行代碼:
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
這樣一來,我們可以方便的通過遞增或遞減這個變量使能或禁用權限檢查功能:
qt_ntfs_permission_lookup++; // turn checking on
qt_ntfs_permission_lookup--; // turn it off again
- 一些QFileInfo函數會查詢整個文件系統,但出於性能原因,還有一些函數只操作文件名本身。例如,爲了獲得一個文件的絕對路徑,absolutePath()必須查詢文件系統。而path()函數,可以直接作用於文件名本身,所以,path()函數的運行會更快。
- 另外還要注意,爲了加速對文件信息的獲取,QFileInfo會緩存文件的信息。但另一方面,文件隨時都有可能被其他用戶或程序,或當前程序的其他函數所改變,所以,QFileInfo還提供了一個refresh() 函數,重新讀取文件信息。如果你想關閉該緩存功能,以確保每次訪問文件信息時都去訪問文件系統獲取當前最新的信息,可以通過調用setCaching(false)來完成。
文件名和路徑類
函數名 | 描述 |
---|---|
baseName | 文件名(不包含完整後綴,不存在.分隔符) |
completeBaseName | 完整文件名(不包含最後一個後綴,可能存在.分隔符) |
suffix | 最後一個後綴(從文件名最後一個.分隔符開始) |
completeSuffix | 完整後綴(從文件名第一個.分隔符開始) |
path | 返回文件的路徑,不包括文件名。但是,如果QFileInfo對象表示的是一個已"/"結尾的路徑,那麼文件名被認爲是空的,此時,該函數返回整個完整路徑。 |
filePath | 返回文件名,包括路徑(可能是絕對路徑,也可能是相對路徑)。 |
fileName | 只返回文件名,不包括路徑。注意,如果QFileInfo對象表示的是一個以"/"結尾的路徑,那麼該函數返回空字符串。 |
dir | 返回一個文件父目錄路徑作爲QDir對象。 |
absoluteDir | 返回一個文件絕對路徑作爲QDir對象。 |
absolutePath | 返回文件的絕對路徑,不包括文件名。 |
absoluteFilePath | 返回一個文件名的絕對路徑。在Unix系統上,會返回一個已"/"開始的目錄;在Windows平臺上,返回一個以驅動器盤符開始的目錄。 |
canonicalPath | 返回文件路徑(不包含文件名),是絕對路徑; |
canonicalFilePath | 規範路徑名是絕對路徑名,並且是惟一的。規範路徑名的準確定義與系統有關。如有必要,此方法首先將路徑名轉換成絕對路徑名,這與調用 absolutefilePath() 方法的效果一樣,然後用與系統相關的方式將它映射到其惟一路徑名。這通常涉及到從路徑名中移除多餘的元素(比如“.”和“…”)、分析符號連接(對於 UNIX 平臺),以及將驅動器名轉換成標準大小寫形式(對於 Microsoft Windows 平臺)。 |
文件訪問權限類
函數名 | 描述 |
---|---|
isReadable | 是否可讀 |
isWriteable | 是否可寫 |
isExecutable | 是否可執行 |
文件所有者類
函數名 | 描述 |
---|---|
owner | 文件所屬者 |
ownerId | 文件所屬者的ID |
group | 文件所屬組 |
groupId | 文件所屬組的ID |
文件相關日期類
函數名 | 描述 |
---|---|
created | 文件創建時的日期和本地時間 |
lastModified | 文件最新一次被修改的日期和本地時間 |
lastRead | 文件最新一次被讀的日期和本地時間 |
示例輸出
============================relative file path============================
=================QFileInfo("./user/xueying/script.tag.gz")================
baseName--------------------->>> "script"
completeBaseName------------->>> "script.tag"
suffix----------------------->>> "gz"
completeSuffix--------------->>> "tag.gz"
bundleName------------------->>> ""
path------------------------->>> "./user/xueying"
filePath--------------------->>> "./user/xueying/script.tag.gz"
fileName--------------------->>> "script.tag.gz"
absolutePath----------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
absoluteFilePath------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying/script.tag.gz"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "xueying"
absoluteDir().absolutePath--->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
absoluteDir().path----------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
absoluteDir().canonicalPath-->>> ""
dir().dirName---------------->>> "xueying"
dir().absolutePath----------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
dir().path------------------->>> "./user/xueying"
dir().canonicalPath---------->>> ""
============================absolute file path============================
================QFileInfo("E:/project/test/script.tag.gz")================
baseName--------------------->>> "script"
completeBaseName------------->>> "script.tag"
suffix----------------------->>> "gz"
completeSuffix--------------->>> "tag.gz"
bundleName------------------->>> ""
path------------------------->>> "E:/project/test"
filePath--------------------->>> "E:/project/test/script.tag.gz"
fileName--------------------->>> "script.tag.gz"
absolutePath----------------->>> "E:/project/test"
absoluteFilePath------------->>> "E:/project/test/script.tag.gz"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "test"
absoluteDir().absolutePath--->>> "E:/project/test"
absoluteDir().path----------->>> "E:/project/test"
absoluteDir().canonicalPath-->>> "E:/project/test"
dir().dirName---------------->>> "test"
dir().absolutePath----------->>> "E:/project/test"
dir().path------------------->>> "E:/project/test"
dir().canonicalPath---------->>> "E:/project/test"
=====================relative dir path with QDir::sepator()=====================
==========================QFileInfo("./user/xueying/")==========================
baseName--------------------->>> ""
completeBaseName------------->>> ""
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "./user/xueying"
filePath--------------------->>> "./user/xueying/"
fileName--------------------->>> ""
absolutePath----------------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteFilePath------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "user"
absoluteDir().absolutePath--->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().path----------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().canonicalPath-->>> ""
dir().dirName---------------->>> "xueying"
dir().absolutePath----------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
dir().path------------------->>> "./user/xueying"
dir().canonicalPath---------->>> ""
=====================absolute dir path with QDir::sepator()=====================
==========================QFileInfo("E:/project/test/")=========================
baseName--------------------->>> ""
completeBaseName------------->>> ""
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "E:/project/test"
filePath--------------------->>> "E:/project/test/"
fileName--------------------->>> ""
absolutePath----------------->>> "E:/project/test"
absoluteFilePath------------->>> "E:/project/test/"
canonicalPath---------------->>> "E:/project"
canonicalFilePath------------>>> "E:/project/test"
absoluteDir().dirName-------->>> "test"
absoluteDir().absolutePath--->>> "E:/project/test"
absoluteDir().path----------->>> "E:/project/test"
absoluteDir().canonicalPath-->>> "E:/project/test"
dir().dirName---------------->>> "test"
dir().absolutePath----------->>> "E:/project/test"
dir().path------------------->>> "E:/project/test"
dir().canonicalPath---------->>> "E:/project/test"
======================relative dir path no QDir::sepator()======================
============================QFileInfo("./user/xueying")=========================
baseName--------------------->>> "xueying"
completeBaseName------------->>> "xueying"
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "./user"
filePath--------------------->>> "./user/xueying"
fileName--------------------->>> "xueying"
absolutePath----------------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteFilePath------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "user"
absoluteDir().absolutePath--->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().path----------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().canonicalPath-->>> ""
dir().dirName---------------->>> "user"
dir().absolutePath----------->>> "E:/project/qt/fileinfoTest/bin/user"
dir().path------------------->>> "./user"
dir().canonicalPath---------->>> ""
======================absolute dir path no QDir::sepator()======================
===========================QFileInfo("E:/project/test")=========================
baseName--------------------->>> "test"
completeBaseName------------->>> "test"
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "E:/project"
filePath--------------------->>> "E:/project/test"
fileName--------------------->>> "test"
absolutePath----------------->>> "E:/project"
absoluteFilePath------------->>> "E:/project/test"
canonicalPath---------------->>> "E:/project"
canonicalFilePath------------>>> "E:/project/test"
absoluteDir().dirName-------->>> "project"
absoluteDir().absolutePath--->>> "E:/project"
absoluteDir().path----------->>> "E:/project"
absoluteDir().canonicalPath-->>> "E:/project"
dir().dirName---------------->>> "project"
dir().absolutePath----------->>> "E:/project"
dir().path------------------->>> "E:/project"
dir().canonicalPath---------->>> "E:/project"