目录
一、概述
二、详解
1. QFile
QFile 类中的一些静态方法:
使用示例:
注意事项:
2. QDir
成员函数
使用实例:
注意事项:
3. QFileInfo
成员函数
使用实例
4. QTemporaryFile
成员函数
使用实例
注意事项:
5. QFileSystemModel
实例
6.QCoreApplication
使用实例
7.QFileSystemWatcher
成员函数
信号
使用实例
一、概述
Qt提供了一些用于文件和目录操作的类,这些类使得在Qt应用程序中进行文件系统操作变得非常方便。以下是一些常用的文件和目录操作相关的类:
-
QFile:用于执行文件的操作,例如读取、写入、复制和移动文件等。
-
QDir:提供了对目录的操作,例如列出目录中的文件、创建和删除目录等。
-
QFileInfo:提供了关于文件和目录的元信息,如文件大小、创建时间、修改时间等。
-
QTemporaryFile:用于创建临时文件,通常用于临时性的文件操作。
-
QFileSystemModel:提供了一个模型来展示文件系统的结构,可以在Qt的视图组件中使用,如QTreeView和QListView。
-
QCoreApplication:获取应用程序的名称、路径、版本和组织名称等信息。
-
QFileSystemWatcher:
用于监视文件系统中文件和目录变化。
这些类都是Qt核心模块的一部分,可以在Qt文档中找到详细的使用说明和示例代码。使用这些类,开发者可以轻松地在Qt应用程序中进行文件和目录操作,而不必依赖于操作系统特定的API。
二、详解
当涉及到文件和目录操作时,Qt提供了一些功能强大且易于使用的类。以下更详细地介绍下每个类的功能,并提供一些具体的实例说明以及注意事项。
1. QFile
QFile
类提供了许多方法来执行文件级别的操作,如读取、写入、复制和移动文件等。
QFile
类中的一些静态方法:
- copy(const QString &fileName, const QString &newName):复制一个文件。fileName 是原始文件名,newName 是新文件名。
- decodeName(const QByteArray &localFileName):将本地文件名解码为 Unicode 编码的文件名。
- decodeName(const char *localFileName):重载版本,接受 char * 类型的本地文件名。
- encodeName(const QString &fileName):将 Unicode 编码的文件名编码为本地文件名。
- exists(const QString &fileName):检查文件是否存在。
- link(const QString &fileName, const QString &linkName):在文件系统中创建一个符号链接。
- moveToTrash(const QString &fileName, QString *pathInTrash = nullptr):将文件移到回收站。可选参数 pathInTrash 用于获取文件在回收站中的路径。
- permissions(const QString &fileName):获取文件的权限。
- remove(const QString &fileName):删除文件。
- rename(const QString &oldName, const QString &newName):重命名文件。
- resize(const QString &fileName, qint64 sz):调整文件大小为 sz 字节。
- setPermissions(const QString &fileName, QFileDevice::Permissions permissions):设置文件的权限。
- symLinkTarget(const QString &fileName):获取符号链接文件的目标路径。
使用示例:
#include <QFile>
#include <QTextStream>
#include <QDebug>
int main() {
// 创建一个文件对象
QFile file("D:\\Desktop\\test.txt");
// 打开文件,以只读模式打开
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Failed to open file";
return -1;
}
// 创建一个文本流,并读取文件内容
QTextStream in(&file);
QString content = in.readAll();
// 输出文件内容
qDebug() << "File content:" << content;
// 关闭文件
file.close();
return 0;
}
注意事项:
- 在打开文件时,一定要检查是否成功打开文件,使用
open()
方法返回的布尔值进行检查。 - 使用文件之后,一定要记得关闭文件,可以通过
close()
方法来关闭文件。
2. QDir
QDir
类提供了对目录的操作,如列出目录中的文件、创建和删除目录等。
成员函数
QDir 类提供了一系列方法来获取目录的信息、列出目录中的文件和子目录、创建和删除目录等。以下是这些方法的简要说明:
- QString absoluteFilePath(const QString &fileName) const:返回指定文件名的绝对路径。
- QString absolutePath() const:返回目录的绝对路径。
- QString canonicalPath() const:返回规范化的路径,即去除符号链接并且进行路径合并。
- bool cd(const QString &dirName):切换到指定的子目录。
- bool cdUp():切换到父目录。
- uint count() const:返回目录中的条目数(文件和子目录的总数)。
- QString dirName() const:返回目录的名称。
- QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:返回符合给定名称过滤器、过滤器和排序标志的文件和子目录的信息列表。
- QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:重载版本,返回所有文件和子目录的信息列表。
- QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:返回符合给定名称过滤器、过滤器和排序标志的文件和子目录的名称列表。
- QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:重载版本,返回所有文件和子目录的名称列表。
- bool exists(const QString &name) const:检查给定名称的文件或子目录是否存在。
- bool exists() const:检查当前目录是否存在。
- QString filePath(const QString &fileName) const:返回指定文件名的完整路径。
- QDir::Filters filter() const:返回目录过滤器。
- bool isAbsolute() const:检查目录是否是绝对路径。
- bool isEmpty(QDir::Filters filters = Filters(AllEntries | NoDotAndDotDot)) const:检查目录是否为空。
- bool isReadable() const:检查目录是否可读。
- bool isRelative() const:检查目录是否是相对路径。
- bool isRoot() const:检查目录是否是根目录。
- bool makeAbsolute():将相对路径转换为绝对路径。
- bool mkdir(const QString &dirName) const:创建一个子目录。
- bool mkpath(const QString &dirPath) const:创建一个多级目录。
- QStringList nameFilters() const:返回名称过滤器列表。
- QString path() const:返回目录的路径。
- void refresh() const:刷新目录的内容,以便反映最新的文件和子目录。
- QString relativeFilePath(const QString &fileName) const:返回指定文件名的相对路径。
- bool remove(const QString &fileName):删除指定文件或子目录。
- bool removeRecursively():递归删除目录及其所有内容。
- bool rename(const QString &oldName, const QString &newName):重命名文件或子目录。
- bool rmdir(const QString &dirName) const:删除指定的子目录。
- bool rmpath(const QString &dirPath) const:递归删除指定的目录及其所有内容。
- void setFilter(QDir::Filters filters):设置目录过滤器。
- void setNameFilters(const QStringList &nameFilters):设置名称过滤器列表。
- void setPath(const QString &path):设置目录的路径。
- void setSorting(QDir::SortFlags sort):设置排序标志。
- QDir::SortFlags sorting() const:返回排序标志。
- void swap(QDir &other):交换两个目录对象的内容。
使用实例:
#include <QDir>
#include <QDebug>
int main() {
// 创建一个目录对象
QDir dir(".");
// 列出目录中的文件
QStringList files = dir.entryList(QDir::Files);
qDebug() << "Files in the current directory:";
foreach(const QString &file, files) {
qDebug() << file;
}
// 创建一个新目录
QDir().mkdir("new_directory");
// 删除一个目录
QDir().rmdir("new_directory");
return 0;
}
注意事项:
- 使用
entryList()
方法可以列出目录中的文件和子目录。 - 使用
mkdir()
方法可以创建新目录,使用rmdir()
方法可以删除目录。
3. QFileInfo
QFileInfo
类提供了关于文件和目录的元信息,如文件大小、创建时间、修改时间等。
成员函数
以下是 QFileInfo
类的一些重要成员函数:
- absoluteDir() const: 返回文件所在目录的绝对路径的 `QDir` 对象。
- absoluteFilePath() const: 返回文件的绝对路径。
- absolutePath() const: 返回文件所在目录的绝对路径。
- baseName() const: 返回文件的基本名称(不包括路径和文件扩展名)。
- birthTime() const: 返回文件的创建时间。
- bundleName() const: 返回文件的 bundle 名称(适用于 macOS)。
- caching() const: 返回是否启用了文件信息缓存。
- canonicalFilePath() const: 返回规范化的文件路径(解析符号链接、路径转义等)。
- canonicalPath() const: 返回文件所在目录的规范化路径。
- completeBaseName() const: 返回文件的完整基本名称(包括路径但不包括文件扩展名)。
- completeSuffix() const: 返回文件的完整后缀名(包括点号)。
- dir() const: 返回文件所在目录的 `QDir` 对象。
- exists() const: 检查文件是否存在。
- fileName() const: 返回文件名(包括路径)。
- filePath() const: 返回文件路径(包括路径)。
- fileTime(QFile::FileTime time) const: 返回文件的指定时间戳(例如最后修改时间、最后访问时间等)。
- group() const: 返回文件所属组。
- groupId() const: 返回文件的组 ID。
- isAbsolute() const: 检查文件路径是否是绝对路径。
- isBundle() const: 检查文件是否是 bundle 文件(适用于 macOS)。
- isDir() const: 检查文件是否是目录。
- isExecutable() const: 检查文件是否可执行。
- isFile() const: 检查文件是否是普通文件。
- isHidden() const: 检查文件是否是隐藏文件。
- isJunction() const: 检查文件是否是 junction(适用于 Windows)。
- isNativePath() const: 检查文件路径是否是本地路径。
- isReadable() const: 检查文件是否可读。
- isRelative() const: 检查文件路径是否是相对路径。
- isRoot() const: 检查文件路径是否是根目录。
- isShortcut() const: 检查文件是否是快捷方式(适用于 Windows)。
- isSymLink() const: 检查文件是否是符号链接。
- isSymbolicLink() const: 重载版本,检查文件是否是符号链接。
- isWritable() const: 检查文件是否可写。
- lastModified() const: 返回文件的最后修改时间。
- lastRead() const: 返回文件的最后访问时间。
使用实例
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
int main() {
// 创建一个文件信息对象
QFileInfo fileInfo("D:\\Desktop\\test.txt");
// 获取文件路径
QString filePath = fileInfo.absoluteFilePath();
qDebug() << "Absolute file path:" << filePath;
// 获取文件大小
qint64 fileSize = fileInfo.size();
qDebug() << "File size:" << fileSize << "bytes";
// 获取文件创建时间
QDateTime createdTime = fileInfo.created();
qDebug() << "File created time:" << createdTime.toString(Qt::ISODate);
return 0;
}
4. QTemporaryFile
QTemporaryFile
类用于创建临时文件,通常用于临时性的文件操作。
成员函数
- bool autoRemove() const:返回当前是否启用了自动删除标志。如果返回 `true`,则在销毁 `QTemporaryFile` 对象时,相关的临时文件将被自动删除;如果返回 `false`,则需要手动调用 `remove()` 函数来删除临时文件。
- QString fileTemplate() const:返回当前的文件名模板。文件名模板是用于生成临时文件名的字符串模板,默认情况下为系统默认的临时文件名模板。
- bool open():尝试打开临时文件。如果打开成功,则返回 `true`,否则返回 `false`。注意,在调用此函数之前,应该已经设置了文件名模板和自动删除标志,并且需要在打开文件之后才能对文件进行读写操作。
- void setAutoRemove(bool b):设置是否启用自动删除标志。如果参数 `b` 为 `true`,则在销毁 `QTemporaryFile` 对象时会自动删除相关的临时文件;如果参数 `b` 为 `false`,则需要手动调用 `remove()` 函数来删除临时文件。
- void setFileTemplate(const QString &name):设置文件名模板。文件名模板是一个字符串,用于生成临时文件的文件名。可以在模板中使用 `%1` 来表示一个随机的唯一标识符。默认情况下,文件名模板采用系统默认的临时文件名模板。
使用实例
#include <QTemporaryFile>
#include <QDebug>
int main() {
// 创建临时文件对象
QTemporaryFile tempFile;
// 设置自动删除标志
tempFile.setAutoRemove(true);
// 打开临时文件
if (!tempFile.open()) {
qDebug() << "Failed to open temporary file";
return -1;
}
// 向临时文件写入数据
tempFile.write("Hello, world!");
// 关闭临时文件
tempFile.close();
// 读取临时文件内容
if (tempFile.open()) {
QByteArray data = tempFile.readAll();
qDebug() << "Temporary file content:" << data;
tempFile.close();
} else {
qDebug() << "Failed to open temporary file for reading";
}
return 0;
}
注意事项:
- 使用
open()
方法打开临时文件时,一定要检查是否成功打开文件。 - 临时文件对象在作用域结束时会自动删除文件,无需手动删除。
5. QFileSystemModel
QFileSystemModel
类提供了一个模型来展示文件系统的结构,可以在Qt的视图组件中使用,如 QTreeView
和 QListView
。
实例
#include <QFileSystemModel>
#include <QTreeView>
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建一个文件系统模型
QFileSystemModel model;
model.setRootPath(QDir::currentPath());
// 创建一个树视图,并将文件系统模型设置为其模型
QTreeView treeView;
treeView.setModel(&model);
treeView.setRootIndex(model.index(QDir::currentPath()));
treeView.show();
return app.exec();
}
6.QCoreApplication
QCoreApplication
类是Qt中的一个核心类,用于创建Qt应用程序的基本框架。它提供了一些功能,使得应用程序可以处理事件循环、管理应用程序的执行以及进行一些基本的初始化工作。主要用于创建不依赖于图形界面的应用程序,例如控制台应用程序和后台服务。
可以通过 applicationName()
、applicationVersion()
和 organizationName()
等方法获取应用程序的名称、版本和组织名称等信息。
使用实例
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
qDebug() << "Application name:" << app.applicationName();
qDebug() << "Application version:" << app.applicationVersion();
qDebug() << "Organization name:" << app.organizationName();
qDebug() << "Command line arguments:";
QStringList args = app.arguments();
foreach(const QString &arg, args) {
qDebug() << arg;
}
// 执行应用程序的事件循环
return app.exec();
}
7.QFileSystemWatcher
QFileSystemWatcher
类是 Qt 中用于监视文件系统中文件和目录变化的类。它可以监视一个或多个文件或目录,当被监视的文件或目录发生变化时,例如被修改、重命名、删除等操作,QFileSystemWatcher
将会发出相应的信号,通知应用程序
成员函数
- bool addPath(const QString &path):添加要监视的单个文件或目录,并返回是否添加成功。如果成功添加,则返回 true;如果文件或目录已经在监视列表中,则返回 false。
- QStringList addPaths(const QStringList &paths):添加要监视的多个文件或目录,并返回已成功添加到监视列表的文件和目录列表。
- QStringList directories() const:返回当前被监视的目录列表。
- QStringList files() const:返回当前被监视的文件列表。
- bool removePath(const QString &path):从监视列表中移除单个文件或目录,并返回是否移除成功。如果成功移除,则返回 true;如果文件或目录不在监视列表中,则返回 false。
- QStringList removePaths(const QStringList &paths):从监视列表中移除多个文件或目录,并返回已成功移除的文件和目录列表。
信号
- directoryChanged(const QString &path):目录发生变化时发出的信号,参数为发生变化的目录路径。
- fileChanged(const QString &path):文件发生变化时发出的信号,参数为发生变化的文件路径。
使用实例
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QFileSystemWatcher watcher;
// 添加要监视的文件或目录
watcher.addPath("D:\\Desktop\\file.txt");
watcher.addPath("D:\\Desktop");
// 监听文件变化信号
QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [&] (const QString &path) {
qDebug() << "File" << path << "changed";
});
// 监听目录变化信号
QObject::connect(&watcher, &QFileSystemWatcher::directoryChanged, [&] (const QString &path) {
qDebug() << "Directory" << path << "changed";
});
return a.exec();
}