QFileInfo主要函數詳解

部分內容來自: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

擴展

  1. 若QFileInfo代表的是目錄,則QFileInfo不會自動在路徑後添加一個"/"。如果你需要這個"/",需要自己手動添加。

  2. 在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
  1. 一些QFileInfo函數會查詢整個文件系統,但出於性能原因,還有一些函數只操作文件名本身。例如,爲了獲得一個文件的絕對路徑,absolutePath()必須查詢文件系統。而path()函數,可以直接作用於文件名本身,所以,path()函數的運行會更快。
  2. 另外還要注意,爲了加速對文件信息的獲取,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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章