Qt系统相关——QFile和QFileInfo
文章目录
- 文件操作
- QFile
- 使用示例
- QFileInfo
文件操作
C语言:
fopen
打开文件fread
、fwrite
读写文件fclose
关闭文件
C++:
fstream
打开文件<<
、>>
流式操作符读写
Linux:
open
打开文件read
、write
读写文件close
关闭文件
Qt自己也提供了一套文件操作,同时也兼任上述的方案,但如果要编写Qt程序,还是建议使用Qt提供的文件操作方案。
Qt诞生的太早了,那会C++还没有标准
QFile
还派生出一个子类QTemporaryFile
,表明一个临时文件,对象销毁,对应文件就自动删除了
QFile
QFile
提供了一些操作文件的成员函数:
-
构造
QFile(const QString &name, QObject *parent) QFile(QObject *parent) QFile(const QString &name) QFile() virtual ~QFile()
-
open
打开文件//比较原生 bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) bool open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) //重写虚函数 virtual bool open(QIODevice::OpenMode mode) override
OpenMode
表明指定哪种方式打开: -
read
/readLine
/readAll
读取文件qint64 read(char *data, qint64 maxSize) QByteArray read(qint64 maxSize) QByteArray readAll() qint64 readLine(char *data, qint64 maxSize) QByteArray readLine(qint64 maxSize = 0)
-
write
写入文件qint64 write(const char *data, qint64 maxSize) qint64 write(const char *data) qint64 write(const QByteArray &byteArray)
-
close
关闭文件virtual void close()
使用示例
实现一个程序,点击窗口里的打开,弹出打开文件的对话框,选择文件,将内容显示到输入框;点击窗口里的保存,将输入框内容写入文件。
mainwindow.h
:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QPlainTextEdit>
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void handleAction1();
void handleAction2();
private:
Ui::MainWindow *ui;
QPlainTextEdit* edit;
};
#endif // MAINWINDOW_H
初始化部分:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//获取菜单栏
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();
QFont font;
font.setPixelSize(20);
edit->setFont(font);
this->setCentralWidget(edit);
//连接信号槽
connect(action1, &QAction::triggered, this, &MainWindow::handleAction1);
connect(action2, &QAction::triggered, this, &MainWindow::handleAction2);
}
打开文件:
void MainWindow::handleAction1()
{
//弹出“打开文件”对话框 选择打开文件
QString path = QFileDialog::getOpenFileName(this);
//文件名显式到状态栏
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
//根据选择路径 构造QFile对象
QFile file(path);
if(!file.open(QIODevice::ReadOnly))
{
statusBar->showMessage(path + "打开文件失败");
return;
}
//读取文件
QString text = file.readAll();
//关闭文件
file.close();
//读取到的内容, 输入到输入框当中
edit->setPlainText(text);
}
QString
重载了=
但是这里需要确保打开的文件是文本文件
保存文件:
void MainWindow::handleAction2()
{
//弹出“保存文件”对话框
QString path = QFileDialog::getSaveFileName(this);
//在状态栏显式文件名
QStatusBar* statusBar = this->statusBar();
statusBar->showMessage(path);
//根据选路径 构造QFile对象 通过写的方式
QFile file(path);
if(!file.open(QIODevice::WriteOnly))
{
statusBar->showMessage(path + "打开文件失败");
}
//读取输入框内容
const QString& text = edit->toPlainText();
//写入文件
file.write(text.toUtf8());
//关闭文件
file.close();
}
直接写入会报错,类型不匹配,可以转成
utf8
,返回类型是QByteArray
QFileInfo
QFileInfo
可以获取到Qt的文件的相关属性(文件名、文件路径、文件后缀等)
类似这样的功能在C/C++标准库本来是没有的;
C++17引入了
filesystem
,可以获取文件的相关属性。
#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>
#include<QDebug>
#include<QFileInfo>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//弹出文件对话框,获取文件属性信息
QString path = QFileDialog::getOpenFileName(this);
//构造QFileInfo对象
QFileInfo fileInfo(path);
//打印相关属性
qDebug() << fileInfo.fileName();
qDebug() << fileInfo.suffix(); //文件后缀
qDebug() << fileInfo.path();
qDebug() << fileInfo.size();
qDebug() << fileInfo.isFile();
qDebug() << fileInfo.isDir();
}