QT-文件
Qt文件系统
Qt 提供了一整套用于文件系统操作的类和工具,它们被设计成跨平台兼容,可以在不同的操作系统上无缝工作。Qt 的文件系统模块主要围绕以下几个核心类和概念:
QIODevice
QIODevice
是所有 I/O 设备类的基类,包括文件、缓冲区、网络套接字等。- 它定义了基本的读写操作,如
read()
和write()
,以及一些状态管理方法,如isOpen()
和open()
QFile
QFile
类继承自QFileDevice
,用于处理本地文件系统上的文件。- 它提供了高级的文件操作功能,例如打开、关闭、读取、写入、移动、复制和删除文件。
QFile
可以与QTextStream
或QDataStream
结合使用,以方便地读写文本和二进制数据。
QFileInfo
- 用于获取和设置文件和目录的信息,如文件大小、权限、修改时间等。
QDir
- 用于操作目录,包括列出目录内容、创建、移除目录、改变当前工作目录等。
QTextStream
- 虽然不是专门的文件系统类,但它提供了读写文本数据的功能,常与
QFile
配合使用。
一、QFile 介绍
QFile 类可以用于打开、读取、写入和关闭文件,以及获取文件信息等操作。
1、QFile常用方法
方法 | 描述 |
---|---|
QFile(const QString &name) | 构造函数,创建一个 QFile 对象并指定文件名。 |
bool open(QIODevice::OpenMode mode) | 打开文件,可以指定打开模式,如只读、只写、读写等。 |
qint64 read(char *data, qint64 maxSize) | 从文件中读取最多 maxSize 字节的数据到指定的 data 缓冲区中。 |
qint64 write(const char *data, qint64 maxSize) | 将数据写入文件,最多写入 maxSize 字节的数据。 |
bool exists() | 判断文件是否存在。 |
qint64 size() | 返回文件的大小。 |
bool remove() | 删除文件。 |
bool rename(const QString &newName) | 重命名文件。 |
bool copy(const QString &newName) | 复制文件到指定路径。 |
2、文件打开方式
打开方式 | 描述 |
---|---|
QFile::ReadOnly | 以只读方式打开文件。 |
QFile::WriteOnly | 以只写方式打开文件。 |
QFile::ReadWrite | 以读写方式打开文件。 |
QFile::Append | 以追加方式打开文件。 |
QFile::Text | 以文本模式打开文件。 |
QFile::Truncate | 如果文件已经存在,则清空文件内容。 |
QFile::Unbuffered | 禁用文件缓冲,直接进行物理I/O操作。 |
QFile::NewOnly | 如果文件已经存在,则打开失败。 |
QFile::ExistingOnly | 如果文件不存在,则打开失败。 |
3、文件读写
工具栏中有如下功能,通过QFile完成新文件的读写操作:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QFileDialog> // 用于文件打开/保存对话框
#include <QPlainTextEdit> // 用于文本编辑显示QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr); // 构造函数~MainWindow(); // 析构函数private slots:void on_open_triggered(); // 打开文件槽函数void on_save_triggered(); // 保存文件槽函数void on_replace_triggered(); // 替换文本槽函数private:QString path; // 当前文件路径Ui::MainWindow *ui; // UI 指针
};#endif // MAINWINDOW_H
cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QDir>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this); // 初始化界面
}MainWindow::~MainWindow()
{delete ui; // 释放界面资源
}// 打开文件槽函数
void MainWindow::on_open_triggered()
{// 弹出文件打开对话框,让用户选择文件path = QFileDialog::getOpenFileName(this, "打开文件", QDir::currentPath());QFile file(path);if (file.open(QFile::ReadWrite)) // 打开文件,可读写{QString text = file.readAll(); // 读取文件内容ui->textEdit->setPlainText(text); // 显示在 QPlainTextEdit 中ui->replace->setEnabled(true); // 启用“替换”按钮ui->save->setEnabled(true); // 启用“保存”按钮this->statusBar()->showMessage(path); // 状态栏显示文件路径file.close(); // 关闭文件}else{this->statusBar()->showMessage("文件打开失败"); // 打开失败提示}
}// 保存文件槽函数
void MainWindow::on_save_triggered()
{QFile file(path);if (file.open(QFile::WriteOnly)) // 以写模式打开{QString text = ui->textEdit->toPlainText(); // 获取文本编辑内容file.write(text.toUtf8()); // 写入文件file.close(); // 关闭文件this->statusBar()->showMessage("保存成功"); // 状态栏提示}else{this->statusBar()->showMessage("保存失败"); // 打开失败提示}
}// “另存为”槽函数
void MainWindow::on_replace_triggered()
{QString filter = "*.txt;*.png"; // 文件类型过滤器// 弹出保存文件对话框QString savePath = QFileDialog::getSaveFileName(this, "保存文件", path, filter);if (!savePath.isEmpty()) // 用户选择了文件路径{bool result = QFile::copy(path, savePath); // 复制当前文件到新路径if (result){path = savePath; // 更新当前文件路径this->statusBar()->showMessage("另存为:" + path); // 状态栏提示}else{this->statusBar()->showMessage("保存失败"); // 复制失败提示}}
}
filePath
是通过 QFileDialog::getOpenFileName()
函数返回的用户选中的文件的完整路径(绝对路径),它可以指向任何路径的文件,而 QDir::currentPath()
只是文件对话框默认打开的起始目录,两者并不冲突。
二、QFileInfo 类
提供关于文件或目录的详细信息,如文件大小、权限、是否为目录、最后修改时间等。
创建 QFileInfo 对象时可以指定一个文件名使该文件作为当前文件,也可以用函数 setFile()指定一个文件作为当前文件。
常用的两种构造函数定义如下:
QFileInfo("文件路径") //指定文件名QFileInfo() //不指定文件名
1、QFileInfo 常用方法
方法 | 描述 |
---|---|
QString fileName() | 返回去除路径的文件名 |
QString filePath() | 返回包含路径的文件名 |
QString path() | 返回不含文件名的路径 |
qint64 size() | 返回文件大小,单位是字节 |
bool isDir() | 判断当前对象是不是一个目录或目录的快捷方式 |
bool isFile() | 判断当前对象是不是一个文件或文件的快捷方式 |
QDateTime birthTime() | 返回文件创建的时间 |
QDateTime lastModified() | 返回文件最后被修改的时间 |
QString suffix() | 返回文件的扩展名 |
2、使用示例
创建QFileInfo
对象
QFileInfo fileInfo("path/to/your/file.txt");
或者
QFile file("path/to/your/file.txt");
QFileInfo fileInfo(file);
获取文件信息:
QFileInfo fileInfo(QDir::currentPath() + "\\123.txt");
qDebug() << "文件名:" << fileInfo.fileName();
qDebug() << "文件路径:" << fileInfo.filePath();
qDebug() << "文件路径:" << fileInfo.path();
qDebug() << "文件大小:" << fileInfo.size();
qDebug() << "是否是目录:" << fileInfo.isDir();
qDebug() << "是否是文件:" << fileInfo.isFile();
qDebug() << "文件创建时间:" << fileInfo.birthTime();
qDebug() << "文件最后修改时间:" << fileInfo.lastModified();
qDebug() << "文件扩展名:" << fileInfo.suffix();
三、QDir 类
用于操作目录(文件夹)。可以用来列出目录下的文件和子目录,创建、删除目录,以及检查目录是否存在等。
1、常用方法
方法 | 描述 |
---|---|
QString rootPath() | 返回系统的根目录的路径 |
QString currentPath() | 返回当前工作目录的路径 |
bool mkdir(QString &dirName) | 在当前目录下创建 dirName 表示的子目录 |
bool exists() | 判断当前目录是否存在 |
bool remove(QString &fileName) | 删除当前目录下的文件 fileName |
2、示例
QDir dir("d:\\test"); // 指定要操作的目录if (dir.exists()) // 判断目录是否存在
{qDebug() << "目录存在"; // 如果存在,输出提示
}
else
{if (dir.mkdir("d:\\test")) // 创建目录{qDebug() << "目录被创建"; // 创建成功提示}else{qDebug() << "目录创建失败"; // 创建失败提示}
}// 获取当前工作目录下的所有文件信息
QDir dir2(QDir::currentPath()); // 当前程序运行目录
QFileInfoList list = dir2.entryInfoList(QDir::Files); // 仅列出文件,不包含子目录foreach (QFileInfo entry, list) { // 遍历文件列表qDebug() << "当前目录下的文件:" << entry.fileName(); // 输出每个文件名
}
四、QTextStream类
QTextStream
是 Qt 中用于处理文本数据流的一个类,方便读写文本数据。
1、构造 QTextStream 对象
可以基于 QFile
来创建一个 QTextStream
对象
// 使用 QFile
QFile file("example.txt");
if (file.open(QFile::ReadOnly)) {QTextStream in(&file);
}
2、设置字符编码
QTextStream
默认使用 UTF-8 编码
QTextStream out(stdout);
out.setCodec("UTF-8"); // 设置编码为 UTF-8
3、读取数据
使用 readLine()
读取一行,readAll()
读取所有文本,或者使用 >>
运算符读取特定类型的数据。
QString line = in.readLine();
QString allText = in.readAll();
int number;
in >> number;
4、写入数据
使用 <<
运算符将数据写入流中。
out << "Hello, world!" << endl;
out << 12345 << " is a number." << endl;