C++ | Qt 文件系统

19 篇文章 5 订阅

目录

一、Qt 文件系统

二、读写文件

1.通过文件对话框获取文件路径

2.读取文件并展示内容

a.读取文件

b.展示内容

c.写入文件

三、获取文件信息


一、Qt 文件系统

Qt 作为一个通用开发库,提供了跨平台的文件操作能力。文件系统主要分为两大类:顺序访问设备和随机访问设备。

1.顺序访问设备

数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,比如:QProcess、QTcpSocket、QUdpSoctet和QSslSocket。

2.随机访问设备

可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针,比如:QFile、QTemporaryFile和QBuffer。

QIODevice是所有 I/O 设备类的父类。

 二、读写文件 

Qt默认支持utf-8编码格式。在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

1.通过文件对话框获取文件路径

QFileDialog fileDialog(this);
QString filePath=  fileDialog.getOpenFileName(this,"选择文件","C://");

2.读取文件并展示内容

Qt内读取文件可以使用QIODevice下的readAll()、write()等方法,还可以通过使用QDataStream或者QTextStream两个类来实现。

  • 简单说一下QDataStream和QTextStream的区别:

        QTextStream 侧重于向QIODevice文本读写,这里所说的文本指的是普通的简单的QChar、QString、QLatin1Char、int等类型的文本。

        QDataStream则是侧重于数据格式和类型,是基于QIODevice的二进制数据的序列化,QDataStream数据流不仅可以操作QTextStream所能处理的普通文本,而且可以对特定格式的类型数据进行序列化和反序列化,比如QBrush, QColor, QDateTime, QFont, QPixmap, QString, QVariant 等等。

        一般来说,二进制用数据流 QDataStream、文本文件用文本流QTextStream。

注意:使用QDataStream写入文本的数据会乱码。读取数据时必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。

  • 数据流

数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。

 使用QIODevice下的方法来进行文件的读写:

a.读取文件

//读取文件方法一:readAll
        QFile file(filePath);
        file.open(QIODevice::ReadOnly);
        QByteArray array= file.readAll();
        ui->textEdit->setText(array);
        file.close();
//读取文件方法二:readLine
        QFile file(filePath);
        file.open(QIODevice::ReadOnly);
        QByteArray array= file.readLine();
        while(!file.atEnd())
        {
            array+= file.readLine();
        }

b.展示内容

方法一:如果文件为utf-8编码
     ui->textEdit->setText(array);//默认支持utf-8,如果文本是gbk则会乱码

方法二:如果文件为utf-8编码
     QTextCodec* code=QTextCodec::codecForName("utf-8");//支持utf-8,如果文本是gbk则会乱码
     ui->textEdit->setText(code->toUnicode(array));

方法三:如果文件为GBK编码
     QTextCodec* code=QTextCodec::codecForName("gbk");//支持gbk,如果文本是utf-8则会乱码
     ui->textEdit->setText(code->toUnicode(array));

方法四:如果文件为GBK编码
     ui->textEdit->setText(QString::fromLocal8Bit(array));//支持gbk,如果文本是utf-8则会乱码

c.写入文件

方法一:文件编码为UTF-8
        QFile file(filePath);
        file.open(QIODevice::Append);
        file.write(QString("这句话是写入的").toUtf8());//当文件格式为utf-8时,不会乱码
        file.close();

方法一:文件编码为GBK
        QFile file(filePath);
        file.open(QIODevice::Append);
        file.write(QString("这句话是写入的").toLocal8Bit());//当文件格式为gbk编码时,不会乱码
        file.close();

三、获取文件信息

文件的相关信息,包括后缀、所在路径、文件名称、修改事件等信息的获取需要依赖QFileInfo来获得。

QFileInfo info(filePath);
qDebug()<<"后缀:"<<info.suffix()
        <<"所在路径:"<<info.path()
        <<"创作时间:"<<info.birthTime().toString("yyyy/MM/dd hh:mm:ss.zzz")
        <<"修改时间:"<<info.lastModified().toString("yyyy/MM/dd hh:mm:ss.zzz");

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值