一、描述
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 使用名称过滤器“*”(所有文件)。
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();
}
}