【QT】文件

目录

概述

输入输出类

文件读写类

open()常用参数取值

使用示例:记事本

注意事项:

文件和目录信息类

使用示例:

其他常用属性:


概述

文件操作是应⽤程序必不可少的部分。Qt 作为⼀个通⽤开发库,提供了跨平台的文件操作能力。 Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。

输入输出类

在 Qt 中,文件读写的类为 QFile 。QFile 的⽗类为 QFileDevice ,QFileDevice 提供了⽂件交互操作的底层功能。 QFileDevice 的⽗类是 QIODevice,QIODevice 的⽗类为 QObject 。
QIODevice 是 Qt 中所有输⼊输出设备(input/output device,简称 I/O 设备)的基础类,I/O 设备就是能进⾏数据输⼊和输出的设备,例如⽂件是⼀种 I/O 设备,⽹络通信中的 socket 是 I/O 设备, 串⼝、蓝⽛等通信接⼝也是 I/O 设备,所以它们也是从 QIODevice 继承来的。Qt 中主要的⼀些 I/O 设备类的继承关系如下图所示:

  • QFile 是⽤于⽂件操作和⽂件数据读写的类,使⽤QFile 可以读写任意格式的⽂件

  • QSaveFile 是⽤于安全保存⽂件的类。使⽤ QSaveFile 保存⽂件时,它会先把数据写⼊⼀个临时⽂件,成功提交后才将数据写⼊最终的⽂件。如果保存过程中出现错误,临时⽂件⾥的数据不会被写 ⼊最终⽂件,这样就能确保最终⽂件中不会丢失数据或被写⼊部分数据。 在保存⽐较⼤的⽂件或复杂格式的⽂件时可以使⽤这个类,例如从⽹络上下载⽂件等。

  • QTemporaryFile 是**⽤于创建临时⽂件的类**。使⽤函数 QTemporaryFile::open() 就能创建⼀个⽂件名唯⼀的临时⽂件,在 QTemporaryFile 对象被删除时,临时⽂件被⾃动删除。

  • QTcpSocket 和 QUdpSocket 是分别实现了TCP 和 UDP 的类

  • QSerialPort 是实现了串⼝通信的类,通过这个类可以实现计算机与串⼝设备的通信。

  • QBluetoothSocket 是⽤于蓝⽛通信的类。⼿机和平板计算机等移动设备有蓝⽛通信模块,笔记本 电脑⼀般也有蓝⽛通信模块。通过QBluetoothSocket类,就可以编写蓝⽛通信程。如编程实现笔记本电脑与⼿机的蓝⽛通信。

  • QProcess 类⽤于启动外部程序,并且可以给程序传递参数。

  • QBuffer 以⼀个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作⼀个 I/O 设备来读写。

文件读写类

  • 读数据:QFile 类中提供了多个⽅法⽤于读取⽂件内容;如 read()、readAll()、readLine()等。
  • 写数据:QFile 类中提供了多个⽅法⽤于往⽂件中写内容;如 write()、writeData()等。
  • 关闭⽂件:⽂件使⽤结束后必须⽤函数 close() 关闭⽂件。

open()常用参数取值

访问⼀个设备之前,需要使⽤open()函数 打开该设备,⽽且必须指定正确的打开模式,QIODevice 中 所有的打开模式由 QIODevice::OpenMode 枚举变量定义,其取值如下:

|-----------------------|------------------------------------------------------------------|
| QIODevice::NotOpen | 没有打开设备 |
| QIODevice::ReadOnly | 以只读⽅式打开设备 |
| QIODevice::WriteOnly | 以只写⽅式打开设备 |
| QIODevice::ReadWrite | 以读写⽅式打开设备 |
| QIODevice::Append | 以追加⽅式打开设备,数据将写到⽂件末尾 |
| QIODevice::Truncate | 每次打开⽂件后重写⽂件内容,原内容将被删除 |
| QIODevice::Text | 在读⽂件时,⾏尾终⽌符会被转换为 '\n';当写⼊⽂件时,⾏尾终⽌符会被转换为 本地编码。如 Win32上为'\r\n'; |
| QIODevice::Unbuffered | ⽆缓冲形式打开⽂件,绕过设备中的任何缓冲区 |
| QIODevice::NewOnly | ⽂件存在则打开失败,不存在则创建⽂件 |

使用示例:记事本

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStatusBar>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("记事本");
    //获取菜单栏
    QMenuBar* menuBar = new QMenuBar();
    this->setMenuBar(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->setCentralWidget(edit);
    QFont font;
    font.setPixelSize(20);
    edit->setFont(font);

    //绑定槽函数
    connect(action1,&QAction::triggered,this,&MainWindow::handleAction1);
    connect(action2,&QAction::triggered,this,&MainWindow::handleAction2);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//打开文件
void MainWindow::handleAction1()
{
    //1.先弹出"打开文件"对话框,让用户选择打开哪个文件
    QString path = QFileDialog::getOpenFileName(this);

    //2.把文件名显示到状态栏里
    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);
    statusBar->showMessage(path);

    //3.根据用户选择的路径,构造一个QFile对象,并打开文件
    QFile file(path);
    bool ret = file.open(QIODevice::ReadOnly);
    if(!ret)
    {
        //打开文件失败
        statusBar->showMessage(path+"打开文件失败!");
        return;
    }


    //4.读取文件
    QString text = file.readAll();

    //5.关闭文件!
    file.close();
    //6.读到的内容设置到输入框中
    edit->setPlainText(text);

}
//保存文件
void MainWindow::handleAction2()
{
    //1.先弹出"保存文件" 对话框
    QString path = QFileDialog::getSaveFileName(this);

    //2.在状态栏中显示这个文件名
    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);
    statusBar->showMessage(path);

    //3.根据用户选择的路径,构造一个QFile对象,并打开文件
    QFile file(path);
    bool ret = file.open(QFile::WriteOnly);
    if(!ret)
    {
        statusBar->showMessage(path+"打开失败!");
        return;
    }

    //4.写文件
    const QString& text = edit->toPlainText();
    file.write(text.toUtf8());

    //5.关闭文件
    file.close();

}

效果如下:

注意事项:

  • file.write(text.toUtf8()); 中write方法不能直接写入QString对象,需要转成Utf8才可以写入成功。
  • QString text = file.readAll(); 返回值是QByte类型,这里使用QString 接收,需要确保打开的文件是一个文本文件才可以,如果是二进制二年间,交给QString不合适,二进制里的内容存啥都行,没有限制,图片、可执行程序、视频、音频。

文件和目录信息类

QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件⼤⼩、⽂件修改⽇期等。QFileInfo类中提供了很多的⽅法,常⽤的有:

  • isDir() 检查该⽂件是否是⽬录;
  • isExecutable() 检查该⽂件是否是可执⾏⽂件;
  • fileName() 获得⽂件名;
  • completeBaseName() 获取完整的⽂件名;
  • suffix() 获取⽂件后缀名;
  • completeSuffix() 获取完整的⽂件后缀;
  • size() 获取⽂件⼤⼩;
  • isFile() 判断是否为⽂件;
  • fileTime() 获取⽂件创建时间、修改时间、最近访问时间等;

使用示例:

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this);

    QFileInfo fileInfo(path);

    qDebug()<<"文件名:"<<fileInfo.fileName();
    qDebug()<<"文件大小:"<<fileInfo.size();
    qDebug()<<"文件路径:"<<fileInfo.filePath();
    //......
}

其他常用属性:

cpp 复制代码
     //⽂件名
     qDebug() << "⽂件名为:" << fileinfo.fileName().toUtf8().data();
     //⽂件后缀名
     qDebug() << "后缀名为:" << fileinfo.suffix().toUtf8().data();
     //⽂件⼤⼩
     qDebug() << "⽂件⼤⼩为:" << fileinfo.size();
     //⽂件路径
     qDebug() << "⽂件路径为:" << fileinfo.path().toUtf8().data();
     //判断是否为⽂件
     qDebug() << "是否为⽂件:"<< fileinfo.isFile();
     //⽂件创建时间
     QDateTime time1 = fileinfo.fileTime(QFileDevice::FileBirthTime);
     qDebug() << "创建时间为:" << time1.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
     //⽂件的最后修改⽇期
     QDateTime time2 = fileinfo.lastModified();
     qDebug() << "最后修改时间为:"<< time2.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
     //判断是否为⽂件夹
     qDebug() << "是否为⽬录:" << fileinfo.isDir();
相关推荐
Oneforlove_twoforjob6 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
engchina22 分钟前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it23 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
诚丞成1 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
Smile灬凉城6661 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx2024061 小时前
SQL MID()
开发语言
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶1 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
鸿蒙自习室1 小时前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库