文章目录
- 文件操作
- 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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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();
}