天天看點

Qt檔案路徑:QDir

一、描述 

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)

傳回目錄分隔符标準化的路徑(即平台原生分隔符轉換為“/”)并删除多餘的分隔符,并盡可能解析“.”和“..”。
Qt檔案路徑:QDir

2、QDir current()

傳回應用程式的目前目錄。

該目錄是使用目前目錄的絕對路徑建構的,確定其 path() 将與其 absolutePath() 相同。

3、QString currentPath()

傳回應用程式目前目錄的絕對路徑。

目前目錄是使用 是父程序啟動此應用程式的目錄或者 setCurrent() 設定的最後一個目錄。

4、QFileInfoList drives()

傳回此系統上的根目錄清單。

在 Windows 上,傳回一個包含“C:/”、“D:/”等的 QFileInfo 對象清單。

在其他作業系統上,傳回一個隻包含一個根目錄(即“/”)的清單。

Qt檔案路徑:QDir

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 是相對路徑的,則傳回的路徑名也将是相對的。

Qt檔案路徑: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();
           
Qt檔案路徑:QDir

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");
           
Qt檔案路徑:QDir

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();
    }
}