天天看点

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