【Qt开发】文件
目录
1,QFile
2,文件和目录信息类
1,QFile
文件的处理除了用C++中的 fstream 外,还可以使用 Qt 专门提供的类QFile。QFile是 Qt 中专门对文件进行处理的类。
QFile 是专门用于文件操作和文件数据读写的类。它提供了处理本地文件系统中的文件的功能,包括打开、关闭、读取和写入等操作。QFile基本使用如下:
创建 QFile 对象:
可以通过指定文件路径来创建一个 QFile
对象。
QFile file("D/file.txt");
打开文件:
QFile 使用 open 方法以不同的模式打开文件(如只读、只写、读写等)。打开模式由QIODevice::OpenMode 枚举变量定义,其取值如下:
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
// 处理错误...
}
读文件:
QFile中读文件操作有 read、readLine、readAll 方法。通常读取操作还会结合 QTextStream
来简化读取过程。
// 读取文本文件
void readFileContent(const QString &filePath) {
QFile file(filePath);
// 尝试以只读模式打开文件
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "无法打开文件:" << file.errorString();
return;
}
QTextStream in(&file);
// readLine读取
while (!in.atEnd()) {
QString line = in.readLine();
qDebug() << "读取到的一行:" << line;
}
// 读取文件的所有内容
QString content = in.readAll();
qDebug() << "文件内容如下:\n" << content;
// 关闭文件
file.close();
}
// 读取二进制文件
// 二进制文件的读取可以不使用QTextStream
void readBinaryFile(const QString &filePath) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "无法打开文件:" << file.errorString();
return;
}
QByteArray data = file.readAll(); // 读取所有数据
qDebug() << "文件大小为:" << data.size() << "字节";
file.close();
}
写文件和关闭文件:
写文件操作可以直接使用write方法。关闭文件对应close方法。
这里来模拟实现使用菜单打开文件和保存文件的样例,综合代码测试如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("简单的记事本");
// 获取菜单栏
QMenuBar* menuBar = this->menuBar();
// 添加菜单
QMenu* menu = new QMenu("文件");
menuBar->addMenu(menu);
// 添加菜单项
QAction* action1 = new QAction("打开");
QAction* action2 = new QAction("保存");
menu->addAction(action1);
menu->addAction(action2);
// 指定一个输入框
edit = new QPlainTextEdit(this);
QFont font;
font.setPixelSize(25);
edit->setFont(font);
this->setCentralWidget(edit);
// 连接QAction的信号槽
connect(action1, &QAction::triggered, this, &MainWindow::handleAction1);
connect(action1, &QAction::triggered, this, &MainWindow::handleAction2);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 打开文件的槽函数
void MainWindow::handleAction1()
{
// 设置打开文件的对话框,让用户选择打开哪个文件
QString path = QFileDialog::getOpenFileName(this);
// 把文件名显示到状态栏里
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
// 根据用户选择的路径,构造一个QFile对象,并打开文件
QFile file(path);
bool ret = file.open(QIODevice::ReadOnly | QIODevice::Text);
if (!ret) { // 打开文件失败
statusBar->showMessage(path + " 打开文件失败");
return;
}
// 读取文件
// 方法一:
// QTextStream in(&file);
// QString text = in.readAll(); // 读取文件的所有内容
// 方法二:
QString text = file.readAll(); // QString接收文件的前提是打开的文件是一个文本文件,二进制文件不合适
// 关闭文件
file.close();
// 读取到的内容设置到输入框中
edit->setPlainText(text);
}
// 保存文件的槽函数
void MainWindow::handleAction2()
{
// 设置保存文件的对话框
QString path = QFileDialog::getSaveFileName(this);
// 在状态栏中显示这个文件名
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
// 根据用户选择的路径,构造一个QFile对象,并打开文件
QFile file(path);
bool ret = file.open(QFile::WriteOnly);
if (!ret) {
statusBar->showMessage(path + " 打开文件失败");
return;
}
// 写入文件
const QString& text = edit->toPlainText();
file.write(text.toUtf8()); // toUtf8将字符串转换为UTF8编码的二进制数据,返回的是QByteArray一个字节数组
// 关闭文件
file.close();
}
2,文件和目录信息类
QFileInfo 是Qt提供的⼀个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo类中提供了很多的方法,常用的有如下:
- isDir() 检查该文件是否是目录。
- isExecutable() 检查该文件是否是可执行文件。
- fileName() 获得文件名。
- completeBaseName() 获取完整的文件名。
- suffix() 获取文件后缀名。
- completeSuffix() 获取完整的文件后缀。
- size() 获取文件大小。
- isFile() 判断是否为文件。
- fileTime() 获取文件创建时间、修改时间、最近访问时间等。
// QFileInfo获取⽂件和⽬录信息
connect(ui->pushButton, &QPushButton::clicked, this, [=](){
QString path = QFileDialog::getOpenFileName(this, "打开⽂件");
QFileInfo fileinfo(path);
// data是QByteArray类用于获取字节数组的底层原始指针(即指向内部数据的const char*指针)的方法
qDebug() << "⽂件名为:" << fileinfo.fileName().toUtf8().data();
qDebug() << "后缀名为:" << fileinfo.suffix().toUtf8().data();
qDebug() << "⽂件⼤⼩为:" << fileinfo.size();
qDebug() << "⽂件路径为:" << fileinfo.path().toUtf8().data();
qDebug() << "是否为⽂件:"<< fileinfo.isFile();
qDebug() << "是否为⽬录:" << fileinfo.isDir();
});