目录
QDir类在Qt 5.15中的详细介绍
一、引言
QDir类是Qt框架中的一个核心类,它提供了对文件系统目录的操作接口。Qt是一个跨平台的应用程序开发框架,广泛用于开发桌面、移动和嵌入式设备上的应用程序。QDir类使得开发者能够方便地在不同操作系统上处理目录和文件,如进行目录遍历、文件查找、创建、删除、移动等操作。
二、使用范围
QDir类用于操作路径名,获取关于目录路径及文件的相关信息。它既可以用于访问文件系统,也可以用于访问Qt的资源系统。QDir可以指向一个用相对路径或绝对路径指明的文件,并支持多种过滤和排序功能,以满足不同的目录和文件操作需求。
三、类的头文件
QDir类的头文件是<QDir>
。在使用QDir类之前,需要包含这个头文件。
cpp
#include <QDir>
四、类的注意事项
-
当调用QDir的相关方法(例如
rename()
,removeRecursively()
)时,需要注意:- 操作文件时不应当在传入参数后加上"/"。
- 操作文件夹时要在传入参数后面加入"/"。
-
QDir的路径分隔符:
- Qt使用"/"作为通用目录分隔符。
- 在Windows上,QDir会将路径转换为符合底层操作系统的格式。
五、类的继承
QDir类不继承任何类,也没有子类。但是,它内部使用了私有类QDirPrivate来管理其内部数据和状态。
六、类的构造介绍
QDir类有多个构造函数,可以接收不同的参数来初始化对象。
QDir()
:构造一个指向当前工作目录的QDir对象。QDir(const QString &path)
:构造一个指向指定路径的QDir对象。QDir(const QDir &other)
:复制构造函数,构造一个与另一个QDir对象相同的QDir对象。
七、公有函数介绍
QDir类提供了丰富的公有函数,用于操作目录和文件。以下是一些常用的公有函数:
bool exists() const
:检查目录是否存在。QString path() const
:返回目录的路径。void setPath(const QString &path)
:设置目录的路径。QString absolutePath() const
:返回目录的绝对路径。QString dirName() const
:返回目录名。bool cd(const QString &dirName)
:改变当前目录到指定的子目录。bool cdUp()
:改变当前目录到父目录。bool mkdir(const QString &dirName) const
:创建目录。bool rmdir(const QString &dirName) const
:删除目录,目录必须为空。QStringList entryList(Filters filters = NoDotAndDotDot | AllDirs | AllFiles, SortFlags sort = NoSort) const
:返回目录中的文件和目录列表。QFileInfoList entryInfoList(Filters filters = NoDotAndDotDot | AllDirs | AllFiles, SortFlags sort = NoSort) const
:返回目录中的文件和目录的详细信息列表。
八、Static函数介绍
QDir类还提供了一些静态函数,用于获取系统路径或进行路径转换。
QDir current()
:返回指向当前工作目录的QDir对象。QString currentPath()
:返回当前工作目录的路径。QDir home()
:返回指向用户主目录的QDir对象。QString homePath()
:返回用户主目录的路径。QDir root()
:返回指向根目录的QDir对象。QString rootPath()
:返回根目录的路径。QDir temp()
:返回指向系统临时目录的QDir对象。QString tempPath()
:返回系统临时目录的路径。QString cleanPath(const QString &path)
:返回目录分隔符标准化的路径。QString fromNativeSeparators(const QString &pathName)
:将路径中的本机分隔符转换为"/"。
九、运算符重载
QDir类没有重载任何运算符。
十、详细代码举例
以下是一个使用QDir类的示例代码,用于列出指定目录下的所有文件,并按文件大小从小到大排序。
cpp
#include <QCoreApplication>
#include <QDir>
#include <QFileInfoList>
#include <QFileInfo>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个 QDir 对象,指向当前工作目录
QDir dir;
// 打印当前工作目录
qDebug() << "Current Directory:" << dir.absolutePath();
// 改变当前目录到指定的路径(假设这个路径存在)
// dir.setPath("/path/to/your/directory");
// 列出目录中的所有条目(文件和子目录)
QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files);
// 遍历文件列表
for (const QFileInfo &fileInfo : fileList) {
// 判断是文件还是目录
if (fileInfo.isFile()) {
qDebug() << "File:" << fileInfo.absoluteFilePath();
} else if (fileInfo.isDir()) {
qDebug() << "Directory:" << fileInfo.absoluteFilePath();
}
// 获取文件的详细信息,如大小、创建时间等
qDebug() << " Size:" << fileInfo.size();
qDebug() << " Created:" << fileInfo.created();
qDebug() << " Last Modified:" << fileInfo.lastModified();
}
// 创建一个新的子目录
QString newDirName = "NewSubDirectory";
if (dir.mkpath(newDirName)) {
qDebug() << "Directory created:" << dir.absoluteFilePath(newDirName);
} else {
qDebug() << "Failed to create directory:" << newDirName;
}
// 重命名目录(假设新目录已经存在)
QString oldDirName = newDirName;
QString newDirNameRenamed = "RenamedSubDirectory";
if (dir.rename(oldDirName, newDirNameRenamed)) {
qDebug() << "Directory renamed from" << oldDirName << "to" << newDirNameRenamed;
} else {
qDebug() << "Failed to rename directory from" << oldDirName;
}
// 删除目录(及其内容,如果设置为递归删除)
if (dir.rmdir(newDirNameRenamed) || dir.removeRecursively(newDirNameRenamed)) {
qDebug() << "Directory removed:" << newDirNameRenamed;
} else {
qDebug() << "Failed to remove directory:" << newDirNameRenamed;
}
return a.exec();
}
在这个示例中,我们首先创建了一个QDir对象,指向指定的目录。然后,我们设置了过滤器来只列出文件,并设置了排序方式为按文件大小排序。最后,我们通过调用entryInfoList()
函数获取了目录中的文件信息列表,并遍历这个列表来打印每个文件的文件名和大小。
通过以上介绍,我们可以看到QDir类在Qt框架中是一个非常强大且灵活的类,它提供了丰富的功能来操作目录和文件。无论是进行简单的目录遍历还是复杂的文件查找和排序,QDir类都能很好地满足我们的需求。