目录
零. 简介
一. QDir
二. QFileSystemWatcher
三. 总结
零. 简介
在 QT 中,文件目录操作主要涉及到QDir
类和QFileInfo
类。
QDir
类具有存取目录结构和内容的能力,可以操作目录、存取目录或文件信息、操作底层文件系统,还可以存取 Qt 的资源文件。它使用“/”作为通用目录分隔符。
QDir
类的一些常用方法包括:
- 构造目录对象:可以使用不同的构造函数来创建
QDir
对象,例如直接传入路径字符串,或指定过滤文件名字符串、排序方式和过滤文件类型等。- 检查目录或文件是否存在:使用
exists()
函数,可检查当前QDir
包含的目录是否存在,或传入指定的目录和文件名来判断其是否存在。- 获取目录路径相关信息:如
dirName()
返回文件名称(如果QDir
包含的是目录则返回空字符串);filePath(const QString &fileName)
获取指定文件的当前路径;absoluteFilePath(const QString &fileName)
获取指定文件的绝对路径;relativeFilePath(const QString &fileName)
获取指定文件的相对路径。需注意这些函数不会检测文件和路径是否真实存在,调用前需使用exists
函数确保路径正确。- 判断目录属性:
isAbsolute()
判断是否为绝对路径;isRelative()
判断是否为相对路径;isReadable()
判断目录或文件是否可读(在 Linux 系统下某些目录普通用户可能无法读取)。- 相对路径到绝对路径的转换:使用
makeAbsolute()
将相对路径转为绝对路径,若路径已是绝对路径则不会产生作用,成功返回true
。- 获取应用程序当前路径:通过静态函数
currentPath()
或current()
获取当前应用程序的路径。- 切换目录:使用
cd(const QString &dirName)
切换目录,或使用静态函数setCurrent(const QString &path)
改变应用程序的工作路径,也可使用setPath(const QString &path)
设置QDir
包含的路径。- 获取系统根目录路径:静态函数
rootPath()
和root()
返回系统的根路径(在 Windows 系统下返回系统的根目录,如“C:/”,在 Linux 下返回“/”);homePath
函数返回用户主目录绝对路径;tempPath
函数返回系统的临时目录绝对路径。- 删除目录和文件:
remove(const QString &fileName)
用于删除指定的文件(不能删除目录),rmdir()
用于删除目录。
QFileInfo
类则提供了与系统无关的文件信息,包括文件的名称、在文件系统中的位置(路径)、文件的访问权限以及是否是一个目录或者符号链接等。还可以获取文件的大小、最近一次修改/读取的时间等。可在构建QFileInfo
对象时设置指向的文件,或之后使用setFile()
来设置。常用方法如使用exists()
查看文件是否存在,使用size()
获取文件的大小,使用isFile()
、isDir()
和isSymLink()
判断文件的类型等。
一. QDir
QDir
类用于操作目录路径、访问目录内容和执行与目录相关的操作。它提供了一种方便且跨平台的方式来处理文件系统中的目录。
属性
path
:获取或设置当前目录的路径。
方法
exists(const QString &name)
:检查指定名称的文件或目录是否存在。mkdir(const QString &dirName)
:创建一个新的目录。rmdir(const QString &dirName)
:删除一个空目录。entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort)
:获取目录中的文件和子目录列表。isRoot()
:判断当前目录是否为根目录。homePath()
:获取用户主目录的路径。currentPath()
:获取当前工作目录的路径。
例子
#include <QCoreApplication>
#include <QDir>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir;
// 获取当前工作目录
QString currentPath = dir.currentPath();
qDebug() << "Current path: " << currentPath;
// 检查目录是否存在
if (dir.exists("test_directory"))
{
qDebug() << "Directory exists";
}
else
{
// 创建目录
if (dir.mkdir("test_directory"))
{
qDebug() << "Directory created";
}
else
{
qDebug() << "Failed to create directory";
}
}
// 获取目录中的文件和子目录列表
QStringList entries = dir.entryList(QDir::Files | QDir::Dirs);
for (const QString &entry : entries)
{
qDebug() << entry;
}
return a.exec();
}
在这个例子中,首先获取了当前工作目录,然后检查指定目录是否存在,如果不存在则尝试创建。最后获取并打印目录中的文件和子目录列表。
效果图
二. QFileSystemWatcher
QFileSystemWatcher
类用于监视文件和目录的更改。它可以检测文件的创建、删除、修改以及目录的内容更改等事件,并发出相应的信号通知应用程序。
属性
directories
:包含被监视的目录列表。files
:包含被监视的文件列表。
方法
addPath(const QString &path)
:添加要监视的文件或目录路径。addPaths(const QStringList &paths)
:添加多个要监视的文件或目录路径。removePath(const QString &path)
:移除指定的被监视路径。removePaths(const QStringList &paths)
:移除多个指定的被监视路径。
例子
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFileSystemWatcher watcher;
// 添加要监视的文件和目录
watcher.addPath("E:\\QTCode\\One\\Two\\test\\test.txt");
watcher.addPath("E:\\QTCode\\One\\Two\\test");
// 连接信号和槽,处理文件系统更改事件
QObject::connect(&watcher, &QFileSystemWatcher::directoryChanged, [](const QString &path) {
qDebug() << "Directory changed: " << path;
});
QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [](const QString &path) {
qDebug() << "File changed: " << path;
});
return a.exec();
}
在上述例子中,创建了一个 QFileSystemWatcher
对象,添加了一个文件和一个目录进行监视,并连接了相应的信号来处理文件系统的更改事件。
效果图
修改文件名
删除文件
三. 总结
在 QT 中,文件和目录操作涉及到几个相关的类,以下是对这些类的总结:
QFile:用于读写文件,支持文本文件和二进制文件的操作。
常用成员函数:
exists()
:判断文件是否存在。remove()
:删除文件。copy()
:将文件内容复制到新文件。open()
:使用设定的 OpenMode 模式打开文件。close()
:关闭文件。flush()
:将所有缓冲的数据刷新到文件中。size()
:返回文件的大小。pos()
:返回数据写入或读取文件的位置,即文件指针的位置。seek()
:设置文件指针的位置。read()
:读取文件数据。write()
:写入数据到文件。
QDir:用于操作目录。
常用成员函数:
exists()
:判断目录是否存在。currentPath()
:获取当前工作目录。setPath()
:设置目录路径。dirName()
:获取目录名。entryList()
:获取目录中的文件和子目录列表。mkdir()
:创建目录。rmdir()
:删除目录。remove()
:删除文件。
QFileInfo:提供与系统无关的文件信息,例如文件的名称、路径、访问权限、是否为目录或符号链接等,还可获取文件的大小和最近修改/读取时间等。
常用成员函数:
exists()
:查看文件是否存在。size()
:获取文件的大小。isFile()
、isDir()
、isSymLink()
:分别判断是否是文件、目录、符号链接。symLinkTarget()
:返回符号链接指向的文件的名称。path()
、fileName()
:分别获取文件的路径和文件名。baseName()
:获取文件名中的基本名称。suffix()
:获取文件名的后缀。completeSuffix()
:获取复合后缀。created()
、lastModified()
、lastRead()
:分别返回文件的创建、最后修改和最后读取时间。isReadable()
、isWritable()
、inExecutable()
:分别获取文件的可读、可写和可执行权限。owner()
、ownerId()
、group()
、grouped()
:获取文件的所有者、所有者 ID、所属组和组 ID。permission()
:一次性读取文件的访问权限和所有权。
QFileSystemWatcher:提供了一个接口,用于监视文件和目录的变化。可以使用 addPath()
添加要监视的文件或目录路径,使用 removePath()
移除监视路径。当被监视的文件或目录发生变化时,会发出相应的信号,如 directoryChanged
信号(目录或其内容被修改或移除时发射)和 fileChanged
信号(文件被修改、重命名或移除时发射)。
另外,还有用于操作临时文件的 QTemporaryFile
和操作临时目录的 QTemporaryDir
类。
在进行文件和目录操作时,需注意文件的打开模式、路径的表示(使用“/”作为目录分隔符)以及权限等问题。通过这些类提供的方法,可以方便地进行文件和目录的各种操作,以及对文件系统的监视。具体的使用方式可以根据项目需求,结合上述类的成员函数进行相应的编程。