【qt】文件类(QFile)
很高兴你能看到这篇文章,同时我的语雀文档也更新了许多嵌入式系列的学习笔记希望能帮到你 :
https://www.yuque.com/alive-m4b9n
目录
- QFile 主要功能
- QFile 操作步骤
- QFile 其他常用函数
- 案例分析及实现
- 功能一实现:打开文件并显示
- 功能二实现:另存为
QFile
是 Qt 提供的一个用于文件操作的类,继承自
QIODevice
,用于处理文件的读取、写入、删除等操作。
使用前需要引入头文件
QFile 主要功能
- 打开文件
- 读取数据
- 写入数据
- 删除文件
- 检查文件状态
- 复制和重命名文件
QFile
支持文本和二进制模式,可以用 QTextStream
或 QDataStream
进行高效的文件操作。
QFile 操作步骤
1️⃣ 创建 QFile 对象
//构造函数
QFile(const QString &name, QObject *parent)
QFile(QObject *parent)
QFile(const QString &name)
---------示例--------------
QFile file("test.txt");
2️⃣ 调用 open()
以指定模式打开文件
bool open(FILE *fh, QIODevice::OpenMode mode, //通过文件路径打开
QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
bool open(int fd, QIODevice::OpenMode mode, //通过fd文件描述符打开
QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
------------------示例-----------------
QFile file("test.txt");
file.open(QIODevice::ReadWrite | QIODevice::Text);
打开模式如下,需要多个模式时用 |
隔开
模式 | 描述 |
---|---|
ReadOnly | 只读模式 |
WriteOnly | 只写模式 |
ReadWrite | 读写模式 |
Append | 追加模式(不会覆盖已有内容) |
Text | 以文本模式打开(自动转换换行符) |
Truncate | 清空文件内容 |
3️⃣ 文件操作:读或者写
//读
QByteArray QIODevice::read(qint64 maxSize) //读取最大maxsize的数据
QByteArray QIODevice::readAll() //读取文件所有数据,返回QByteArray数组
//写
qint64 write(const QByteArray &byteArray) //QByteArray 数据
qint64 write(const char *data, qint64 maxSize) //char* 指针,数据大小
----------示例-----------
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QByteArray content = file.readAll();
qDebug() << "文件内容:\n" << content;
file.close();
}
4️⃣ 关闭
void QFileDevice::close()
QFile 其他常用函数
类别 | 函数 | 作用 | 示例代码 |
---|---|---|---|
文件基本操作 | exists() | 判断文件是否存在 | if (file.exists()) qDebug() << "文件存在" |
remove() | 删除文件 | file.remove(); | |
copy(src, dst) | 复制文件 | QFile::copy("test.txt", "backup.txt"); | |
rename(old, new) | 重命名/移动文件 | file.rename("new_name.txt"); | |
flush() | 刷新缓冲区 | file.flush(); | |
文件信息 | size() | 获取文件大小(字节) | qDebug() << file.size(); |
fileName() | 获取文件名(可能是相对路径) | qDebug() << file.fileName(); | |
absoluteFilePath() | 获取文件的绝对路径 | qDebug() << QFileInfo(file).absoluteFilePath(); | |
permissions() | 获取文件权限 | qDebug() << file.permissions(); | |
setPermissions() | 修改文件权限 | file.setPermissions(QFileDevice::ReadOwner) | |
读写文件 | isReadable() | 是否可读 | if (file.isReadable()) qDebug() << "可读"; |
isWritable() | 是否可写 | if (file.isWritable()) qDebug() << "可写"; | |
文件状态 | isOpen() | 判断文件是否已打开 | if (file.isOpen()) qDebug() << "文件已打开"; |
isWritable() | 判断文件是否可写 | if (file.isWritable()) qDebug() << "文件可写"; | |
handle() | 获取底层文件句柄 | int fd = file.handle(); |
案例分析及实现
需求
- 打开文件对话框,获取文件路径名,然后通过文件操作将文件内容显示到输入框上
- 点击另存为按钮可以保存当前文件到其他地方去。
功能一实现:打开文件并显示
思路
1️⃣ 打开文件选择对话框(
QFileDialog::getOpenFileName
)2️⃣ 获取用户选择的文件路径
3️⃣ 使用
QFile
读取文件内容 4️⃣ 将内容显示到QTextEdit
mainwindow.h
private slots:
void on_openButton_clicked(); // 打开文件
void on_saveAsButton_clicked(); // 另存为
private:
Ui::MainWindow *ui;
QString currentFilePath; // 存储当前文件路径
mainwindow.cpp
//打开文件
void MainWindow::on_openButton_clicked()
{
//打开文件对话框,获取文件路径
QString filePath = QFileDialog::getOpenFileName(this,"选择文件","","文本文件(*.txt);;所有文件(*.*)");
if(filePath.isEmpty())
{
qDebug()<<"未选择文件";
return;
}
qDebug() << "选择的文件路径:" << filePath;
currentFilePath = filePath; //记录当前的文件路径
//打开文件
QFile file(filePath);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<"文件打开失败"<<file.errorString();//输出错误信息
return;
}
//读取文件内容
QTextStream in(&file);
QString fileContent = in.readAll();
file.close();
//显示到QtextEdit上
ui->textEdit->setText(fileContent);
}
效果
功能二实现:另存为
mainwindow.cpp
// 另存为
void MainWindow::on_saveAsButton_clicked()
{
// 打开文件对话框,获取保存路径
QString saveFilePath = QFileDialog::getSaveFileName(this, "另存为", "",
"文本文件 (*.txt);;所有文件 (*.*)");
if (saveFilePath.isEmpty()) {
qDebug() << "未选择保存路径";
return;
}
qDebug() << "保存文件路径:" << saveFilePath;
// 打开文件
QFile file(saveFilePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "文件保存失败:" << file.errorString();
return;
}
// 获取 QTextEdit 中的内容
QString content = ui->textEdit->toPlainText();
// 写入文件
QTextStream out(&file);
out << content;
file.close();
qDebug() << "文件保存成功";
}
效果