一、描述
QDir 用于操作路徑名、通路有關路徑和檔案的資訊、操作底層檔案系統。它也可以用來通路 Qt 的資源系統。
Qt 使用“/”作為通用目錄分隔符。如果總是使用“/”作為目錄分隔符,Qt 将轉換路徑以符合底層作業系統。
QDir 可以使用相對或絕對路徑指向檔案。
- 絕對路徑以目錄分隔符開頭(在 Windows 下可選地以驅動器規範開頭)。
- 相對檔案名以目錄名或檔案名開頭,并指定相對于目前目錄的路徑。
絕對路徑的示例:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
在 Windows 上,當用于通路檔案時,上面的第二個示例将轉換為 C:\Documents and Settings。
相對路徑示例:
QDir("images/landscape.png")
以冒号 (:) 開頭的路徑始終被視為絕對路徑,因為它們表示 QResource。
二、類型成員
1、enum QDir::Filter:此枚舉描述了 QDir 可用的過濾選項。例如用于 entryList() 和 entryInfoList()。過濾器值是通過使用按位 OR 運算符組合以下值來指定的:
- Dirs:列出與過濾器比對的目錄。
- AllDirs:列出所有目錄。
- Files:列出檔案。
- Drives:列出磁盤驅動器(在 Unix 下被忽略)。
- NoSymLinks:不列出符号連結(被不支援符号連結的作業系統忽略)。
- NoDotAndDotDot:不列出特殊條目“.”和 ”..”。
- NoDot:不列出特殊條目“.”。
- NoDotDot:不列出特殊條目“..”。
- AllEntries:列出目錄、檔案、驅動器和符号連結。
- Readable:列出應用程式具有讀取權限的檔案(應用程式可以讀取它)。此值需要與 Dirs 或 Files 結合使用。
- Writable:列出應用程式對其具有寫入權限的檔案。 此值需要與 Dirs 或 Files 結合使用。
- Executable:列出應用程式對其具有執行權限的檔案。此值需要與 Dirs 或 Files 結合使用。
- Modified:僅列出已修改的檔案(在 Unix 上忽略)。
- Hidden:列出隐藏檔案(在 Unix 上,檔案以“.”開頭)。
- System:列出系統檔案(在 Unix 上,包括 FIFO、套接字和裝置檔案;在 Windows 上,包括 .lnk 檔案)
- CaseSensitive:過濾器應區分大小寫。
2、enum QDir::SortFlag:這個枚舉描述了 QDir 可用的排序選項,例如用于 entryList() 和 entryInfoList()。排序值由以下值通過 OR 運算指定:
- Name:按名稱排序。
- Time:按時間排序(修改時間)。
- Size:按檔案大小排序。
- Type:按檔案類型(擴充名)排序。
- Unsorted:不排序。
- NoSort:預設不排序。
- DirsFirst:先目錄後檔案。
- DirsLast:先檔案後目錄。
- Reversed:反轉排序順序。
- IgnoreCase:不區分大小寫排序。
- LocaleAware:使用目前區域設定(QLocale)适當地對項目進行排序。
三、成員函數
3.1、靜态成員函數
1、QString cleanPath(const QString &path)
傳回目錄分隔符标準化的路徑(即平台原生分隔符轉換為“/”)并删除多餘的分隔符,并盡可能解析“.”和“..”。
2、QDir current()
傳回應用程式的目前目錄。
該目錄是使用目前目錄的絕對路徑建構的,確定其 path() 将與其 absolutePath() 相同。
3、QString currentPath()
傳回應用程式目前目錄的絕對路徑。
目前目錄是使用 是父程序啟動此應用程式的目錄或者 setCurrent() 設定的最後一個目錄。
4、QFileInfoList drives()
傳回此系統上的根目錄清單。
在 Windows 上,傳回一個包含“C:/”、“D:/”等的 QFileInfo 對象清單。
在其他作業系統上,傳回一個隻包含一個根目錄(即“/”)的清單。
5、QString fromNativeSeparators(const QString &pathName)
使用“/”作為檔案分隔符傳回 pathName。
qDebug()<< QDir::fromNativeSeparators("c:\\winnt\\system32");
//"c:/winnt/system32"
例如,在 Windows 上,fromNativeSeparators("c:\\winnt\\system32") 傳回 "c:/winnt/system32"。
傳回的字元串可能與某些作業系統上的參數相同,例如在 Unix 上。
6、QDir home()
傳回使用者的主目錄。
該目錄是使用主目錄的絕對路徑建構的,確定其 path() 與其 absolutePath() 相同。
7、QString homePath()
傳回使用者主目錄的絕對路徑。
在 Windows 下,此函數将傳回目前使用者配置檔案的目錄。
C:/Documents and Settings/Username
8、bool isAbsolutePath(const QString &path)
path是否絕對路徑。
注意:以冒号 (:) 開頭的路徑始終被視為絕對路徑,因為它們表示 QResource。
9、bool isRelativePath(const QString &path)
路徑是否相對路徑。
注意:以冒号 (:) 開頭的路徑始終被視為絕對路徑,因為它們表示 QResource。
10、QChar listSeparator()
傳回本地路徑清單分隔符。Unix:':';Windows:';'。
11、QDir root()
傳回根目錄。
12、QString rootPath()
傳回根目錄的絕對路徑。Unix 作業系統将傳回“/”。Windows 系統通常傳回“c:/”。
13、QChar separator()
傳回本機目錄分隔符:Unix 下的“/”和 Windows 下的“\”。
14、void setSearchPaths(const QString &prefix, const QStringList &searchPaths)
設定字首的搜尋路徑。Qt 使用此搜尋路徑來定位具有已知字首的檔案。
要為檔案名指定字首,請在字首後跟一個冒号。字首隻能包含字母或數字(例如,它不能包含冒号或斜線)。字首必須至少有 2 個字元長,以避免與 Windows 驅動器号發生沖突。
QDir::setSearchPaths("icons", QStringList(QDir::homePath() + "/images"));
QDir::setSearchPaths("docs", QStringList(":/embeddedDocuments"));
QPixmap pixmap("icons:undo.png"); //将到 QDir::homePath() + "/images" 檔案夾搜尋 undo.png
QFile file("docs:design.odf"); //将到 :/embeddedDocuments資源路徑搜尋 design.odf
QDir::setSearchPaths("jpg",QStringList("D:/測試"));
qDebug()<<QFile::exists("jpg:5.jpg");
15、QDir temp()
傳回系統的臨時目錄。
16、QString tempPath()
傳回系統臨時目錄的規範絕對路徑。
- 在 Unix/Linux 系統上,這是 TMPDIR 環境變量或 /tmp(如果 TMPDIR 未定義)中的路徑。
- 在 Windows 上,這通常是 TEMP 或 TMP 環境變量中的路徑。
17、QString toNativeSeparators(const QString &pathName)
将參數中的路徑“/”分隔符轉換為适用于底層作業系統的分隔符。
如在 Windows 上,toNativeSeparators("c:/winnt/system32") 傳回 "c:\winnt\system32"。
3.2、非靜态成員函數
1、QDir(const std::filesystem::path &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(Name | IgnoreCase), QDir::Filters filters = AllEntries)
QDir(const QString &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(Name | IgnoreCase), QDir::Filters filters = AllEntries)
構造一個帶有路徑 path 的 QDir,它使用 nameFilter 按名稱過濾其條目,并使用過濾器按屬性過濾。 它還使用 sort 對名稱進行排序。
預設的 nameFilter 是一個空字元串,不排除任何内容; 預設過濾器是 AllEntries,它也不排除任何内容。 預設排序為名稱 | IgnoreCase,即按名稱排序,不區分大小寫。
如果路徑為空,QDir 使用“.” (目前目錄)。 如果 nameFilter 是一個空字元串,QDir 使用名稱過濾器“*”(所有檔案)。
C++17 新增功能 std::filesystem
QDir(const std::filesystem::path &path)
QDir(const QString &path = QString())
構造一個指向給定目錄路徑的 QDir。如果路徑為空,則使用程式的工作目錄(“.”)。
2、QString absoluteFilePath(const QString &fileName)
傳回目錄中檔案的絕對路徑名。不檢查檔案是否确實存在于目錄中。
3、QString absolutePath()
傳回絕對路徑。
std::filesystem::path filesystemAbsolutePath()
将 absolutePath() 作為 std::filesystem::path 傳回。
QDir dir;
dir.setPath("D:/text");
std::filesystem::path path = dir.filesystemAbsolutePath();
qDebug()<<path.string().c_str();
4、QString canonicalPath()
傳回規範路徑,即沒有符号連結或備援“.”、“..”的路徑。
在沒有符号連結的系統上,此函數将始終傳回與 absolutePath() 傳回的字元串相同。
std::filesystem::path filesystemCanonicalPath()
将 canonicalPath() 作為 std::filesystem::path 傳回。
5、bool cd(const QString &dirName)
将 QDir 的目錄更改為 dirName。傳回新目錄是否存。
如果新目錄不存在,則不會執行邏輯 cd() 操作。
調用 cd("..") 等同于調用 cdUp()。
6、bool cdUp()
通過從 QDir 的目前目錄向上移動一個目錄來更改目錄。傳回新目錄是否存在。
如果新目錄不存在,則不會執行邏輯 cdUp() 操作。
7、uint count()
傳回目錄中目錄和檔案的總數。等效于 entryList().count()。
8、QString dirName()
傳回目錄名稱。例如路徑 “/var/spool/mail” 的名稱是“mail”。
不進行檢查以確定具有此名稱的目錄确實存在。
9、QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort)
QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort)
傳回目錄中所有檔案和目錄的 QFileInfo 對象清單,根據使用 setNameFilters() 和 setFilter() 設定的名稱和屬性過濾器排序,并根據使用 setSorting() 設定的标志進行排序。
可以使用 nameFilters、filters 和 sort 參數覆寫名稱過濾器、檔案屬性過濾器和排序規範。
10、QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort)
QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort)
傳回目錄中所有檔案和目錄的名稱清單,根據使用 setNameFilters() 和 setFilter() 設定的名稱和屬性過濾器排序,并根據使用 setSorting() 設定的标志進行排序。
可以使用 nameFilters、filters 和 sort 參數覆寫名稱過濾器、檔案屬性過濾器和排序規範。
11、bool exists(const QString &name)
- name 包含檔案絕對路徑,檔案是否存在。
- name 不包含檔案絕對路徑,目錄是否存在。
bool exists()
目錄(不是檔案)是否存在則傳回真。
12、QString filePath(const QString &fileName)
傳回目錄中檔案的路徑名。不檢查檔案是否确實存在于目錄中。
如果 QDir 是相對路徑的,則傳回的路徑名也将是相對的。
13、QString path()
傳回路徑。可能包含符号連結,但不包含多餘的“.”、“..”或多個分隔符。
傳回的路徑可以是絕對的或相對的。
std::filesystem::path filesystemPath()
将 path() 作為 std::filesystem::path 傳回。
14、bool isAbsolute()
目錄的路徑是否絕對路徑。
注意:以冒号 (:) 開頭的路徑始終被視為絕對路徑,因為它們表示 QResource。
15、bool isEmpty(QDir::Filters filters = Filters(AllEntries | NoDotAndDotDot))
傳回目錄是否為空。
16、bool isReadable()
目錄是否可讀并且可以按名稱打開檔案。
17、bool isRelative()
目錄路徑是否是相對的。(在 Unix 下,如果路徑不以“/”開頭,則路徑是相對的)。
注意:以冒号 (:) 開頭的路徑始終被視為絕對路徑,因為它們表示 QResource。
18、bool isRoot()
目錄是否根目錄。
19、bool makeAbsolute()
将目錄路徑轉換為絕對路徑。傳回轉換結果。
QDir dir;
qDebug()<<dir.path();
dir.makeAbsolute();
qDebug()<<dir.path();
20、bool mkdir(const QString &dirName)
建立一個名為 dirName 的子目錄。傳回建立結果。
如果調用該函數時目錄已經存在,則傳回false。
21、bool mkpath(const QString &dirPath)
建立目錄路徑 dirPath。該函數将建立建立目錄所需的所有父目錄。傳回建立結果。
如果調用該函數時目錄已經存在,則傳回false。
22、void refresh()
重新整理目錄資訊。
23、QString relativeFilePath(const QString &fileName)
傳回檔案名相對于目錄的路徑。
QDir dir;
qDebug()<<dir.absolutePath();
qDebug()<<dir.relativeFilePath("C:/Users/70957/Pictures/aaa.jpg");
qDebug()<<dir.relativeFilePath("D:/eee.jpg");
24、bool remove(const QString &fileName)
删除檔案fileName。傳回删除結果。
25、bool removeRecursively()
删除目錄,包括其所有内容。傳回删除結果。
如果無法删除檔案或目錄,removeRecursively() 會繼續并嘗試删除盡可能多的檔案和子目錄,然後傳回 false。
26、bool rename(const QString &oldName, const QString &newName)
将檔案或目錄從 oldName 重命名為 newName。傳回重命名結果。
oldName 不存在或具有新名稱的檔案已存在時會失敗。
27、bool rmdir(const QString &dirName)
删除由 dirName 指定的目錄。傳回删除結果。dirName 必須是空目錄才能被删除。
28、bool rmpath(const QString &dirPath)
删除目錄路徑 dirPath。傳回删除結果。
該函數将删除 dirPath 中的所有父目錄,前提是它們為空。 這與 mkpath(dirPath) 相反。
29、void setFilter(QDir::Filters filters)
設定過濾器。過濾器用于指定應由 entryList() 和 entryInfoList() 傳回的檔案類型。
30、void setNameFilters(const QStringList &nameFilters)
設定名稱過濾器。名稱過濾器用于 entryList() 和 entryInfoList() 。
QStringList filters;
filters << "*.cpp" << "*.cxx" << "*.cc";
dir.setNameFilters(filters);
31、void setPath(const QString &path)
void setPath(const std::filesystem::path &path)
設定目錄的路徑。不檢查具有此路徑的目錄是否實際存在。路徑可以是絕對或相對的。
32、void setSorting(QDir::SortFlags sort)
設定 entryList() 和 entryInfoList() 使用的排序順序。
四、宏成員
1、void Q_CLEANUP_RESOURCE(name)
解除安裝由具有基本名稱 name 的 .qrc 檔案指定的資源。
通常,當應用程式終止時,Qt 資源會自動解除安裝,但如果資源位于正在解除安裝的插件中,則使用此宏強制删除資源。
注意:這個宏不能在命名空間中使用。
Q_CLEANUP_RESOURCE(myapp);
2、void Q_INIT_RESOURCE(name)
使用指定的基本名稱初始化 .qrc 檔案指定的資源。
通常,當資源作為應用程式的一部分建構時,資源會在啟動時自動加載。對于存儲在靜态庫中的資源,在某些平台上需要調用此宏。
例如,如果應用程式的資源列在名為 myapp.qrc 的檔案中,可以通過将以下行添加到 main() 函數來確定在啟動時初始化資源:
Q_INIT_RESOURCE(myapp);
如果檔案名包含不能作為有效 C++ 函數名的一部分的字元(例如 “-”),則必須将它們替換為下劃線字元(“_”)。
注意:這個宏不能在命名空間中使用。它應該從 main() 調用。 如果不能從main()調用,可以使用以下解決方法:
inline void initMyResource()
{
Q_INIT_RESOURCE(myapp);
}
namespace MyNamespace
{
...
void myFunction()
{
initMyResource();
}
}