文件系统和文件读写

文件系统和文件读写

本章介绍Qt中如何实现文本文件,二进制文件的读写,及文件和目录的管理功能

文本文件读写

实例功能概述

Qt提供了两种读写纯文本文件的基本方法
一种是用QFile类的IODevice读写功能直接进行读写
另一种是利用QFileQTextStream结合,用流的方法进行文件读写

QFile读写文本文件

QFile类是直接与IO设备打交道,进行文件读写操作的类
QFile可直接打开或保存文本文件
QDir支持QString currentPath()
QFileDialog支持QString getOpenFileName(...)
QFile支持bool exists(),bool open(...),void close(),? readAll()

QPlainTextEdit支持void setPlainText(...)
QTabWidget支持void setCurrentIndex(...)
QFile::open需传递QIODevice::OpenModeFlag
QIODevice::OpenModeFlag类型主要取值如下:

描述
QIODevice::ReadOnly以只读方式打开,用于载入
QIODevice::WriteOnly以只写方式打开,用于保存文件
QIODevice::ReadWrite以读写方式打开
QIODevice::Append以添加模式打开,新写入文件的数据添加到文件尾部
QIODevice::Truncate以截取方式打开文件,文件原有的内容全部被删除
QIODevice::Text以文本方式打开文件,读取时"\n"被自动翻译为换行符,写入时结束符自动翻译为系统平台的编码.windows下为\r\n

QFileDialog支持QString getSaveFileName(...)
QFile支持bool open(...),void write(...),void close()

QPlainTextEdit支持QString toPlainText()

QString支持QByteArray toUtf8(),int length()
QTabWidget支持void setCurrentIndex(...)

QFile和QTextStream结合读写文本文件

QTextStreamIO读写设备结合
为数据读写提供了一些方便的方法的类
QTextStream可与QFile, QTemporaryFile, QBuffer, QTcpSocket, QUdpSocketIO设备类结合使用
QFile支持bool exists(),bool open(...),void close()

QTextStream支持void setAutoDetectUnicode(...),? readAll(),bool atEnd(),QString readLine(),QTextStream& operator<<(...)
QPlainTextEdit支持void setPlainText(...),void clear(),void appendPlainText(QString)

QTabWidget支持void setCurrentIndex(...)
如关联的文本文件有汉字,需设定自动识别Unicode,即调用setAutoDetectUnicode(...)
QTextStream可方便地实现逐行读取文本文件内容
QTextStream::readLine识别换行符来获取下一行字符串

解决中文乱码问题

QTextStream::setAutoDetectUnicode(...)为解决Unicode的识别问题,可在应用程序中做全局的设置,使得应用程序支持Unicode,方法是在main函数中用QTextCodec类进行编码设置.

QTextCodec* codec = QTextCodec::codecForName("UTF-8")	
QTextCodec::setCodecForLocate(codec)

此时,即使后续QTextStream不调用setAutoDetectUnicode也可正常工作

二进制文件读写

实例功能概述

除了文本文件外,其他需要按照一定格式读写的文件称为二进制文件
Qt使用QFileQDataStream进行二进制数据文件的读写
QFile负责文件的IO设备接口,即与文件的物理交互
QDataStream以数据流的方式读取文件内容或写入文件内容

根据QDataStream保存文件时使用的数据编码的方式不同,可保存两种文件

  • Qt预定义编码保存各种类型数据的文件,文件后缀为".stm"
    Qt预定义编码指在写入某个类型数据到文件流时,使用Qt预定义的编码
    可将这种Qt预定义数据格式编码类比于HTML的标记符
    Qt写入某种类型数据时用了Qt预定义的标记符
    读出数据时,根据标记符读出数据
    Qt预定义编码保存的流文件,某些字节是QDataStream自己写入的
    不完全知道文件内每个字节的意义,但用QDataStream可读出相应数据
  • 标准编码数据文件
    定义文件后缀为".dat"
    将数据写到文件时,完全使用数据的二进制原始内容
    每个字节有具体的定义
    读出数据时,需根据每个字节的定义读出数据即可

Qt预定义编码文件的读写

保存为stm文件

QDir支持QString currentPath()
QFileDialog支持QString getSaveFileName(...)
QFile支持void open(…),void close()

QDataStream支持void setVersion(...),QDataStream& operator<<(...)
QStandardItemModel支持qint16 rowCount(),qint16 columuCount(),int columnCount(),QVarient horizontalHeaderItem(...),QStandardItem* item(...)

QStandardItem支持QVariant data(...)

创建QFile对象打开文件
创建QDataStream对象与QFile对象关联
开始写数据流之前,为QDataStream对象设置版本号,即调用setVersion
传递一个QDataStream::Version枚举类型值

需要保证写文件和读文件的流版本兼容
<< 不论写的是qint, qreal还是字符串都可以
QDataStream流操作还可写入,如QBrush, QColor, QImage, QIcon等类型,称这些类型为可序列化的数据类型
文件写入时,知道写入顺序和类型即可
文件读出时,按顺序和类型读出
文件具体的字节存储不关注

stm文件格式

读取和写入保持顺序和类型一致,具体存储由Qt封装

读取stm文件

QDir支持QString currentPath()
QFileDialog支持QString getOpenFileName(...)
QFile支持bool open(...),void close()

QDataStream支持void setVersion(...),QDataStream& operator>>(...)
QStandardItem支持void setData(...),void setCheckState(...),void setCheckable(...),void setEditable(...)

QModelIndex支持QModelIndex index(...),QStandardItem* itemFromIndex(...)
QStandardItemModel支持void removeRows(...),void setRowCount(...),QVariant headerData(...),QModelIndex index(...),QStandardItem* itemFromIndex(...)

对使用QDataStream的流操作方式读写文件的特点如下

  • 读写操作比较方便,支持读写各种数据类型,包括Qt的一些类
    还可为流数据读写扩展自定义的数据类型
    读写某种类型数据时,文件内部如何存储无需关心
  • 写文件和读文件时必须保证使用的流版本兼容
    读取时的流版本可以高于或等于写入时的版本号
  • 保存文件时,写入数据采用Qt预定义的编码
    此形式,不适合存储的文件需要和非Qt文件互动的情况

标准编码文件的读写

保存为dat文件

Qt预定义编码操作stm文件,文件格不透明
创建通用格式文件[文件格式透明]的方法是以标准编码方式创建文件,使文件的每个字节都有具体的定义
用户读取这种文件时,按文件格式定义读取每个字节数据并做解析即可
QDir支持QString currentPath()
QFileDialog支持QString getSaveFileName(...)
QFile支持bool open(...)
QDataStream支持void setByteOrder(...),void writeRawData(...),void writeBytes(...)
QStandardItemModel支持qint16 rowCount(),qint16 columnCount(),QStandardItem* horizontalHeaderItem(...)

QStandardItem支持QStream text()
QString支持QByteArray toUtf8()

- 字节序
在保存为标准编码的二进制文件时,
无须指定QDataStream版本
但如有必要,需为文件指定字节顺序
小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处.大端序相反
读取一个文件时,需知道它是什么字节存储的,才可正确读出
- 对writeRawData
- writeBytes,先写入字符串长度,再写入内容
QDataStream提供了与writeBytes对应的readBytes,可自动读取长度和内容

dat文件格式
读取dat文件

QFile支持bool open(...)
QDataStream支持void setByteOrder(...),void readRawData(...),void readBytes(...)

QString支持QString fromLocal8Bit(...)
QStandardItem支持void setData(...)
QModelIndex,QStandardItemModel支持QModelIndex index(...),QStandardItem itemFromIndex(...)

字节序

流创建后,需用setByteOrder指定字节序,且与写入文件时一致

readRawData
readBytes

文件目录操作

文件目录操作相关的类

Qt提供的与文件和目录操作相关的类包括以下几个
- 对QCoreApplication
用于提取应用程序路径,程序名等文件信息
- 对QFile
打开,复制,删除文件等
- 对QFileInfo
用于提取文件信息,包括路径,文件名,后缀等
- 对QDir
用于提取目录或文件信息,
获取目录下的文件或目录列表,创建,删除目录和文件,文件重命名等
- 对QTemporaryDirQTemporaryFile用于创建临时目录和临时文件
- 对QFileSystemWatcher
文件和目录监听类,监听目录下文件的添加,删除等变化
监听文件修改变化

实例概述

实例功能
信号发射者信息的获取

槽函数中调用sender()可获取到发送信号对象的指针
QFileInfo支持QString baseName()
QPushButton支持QString text(),QString toolTip()

QCoreApplication

QCoreApplication为无GUI应用提供事件循环的类,是所有应用程序类的基类
其子类QGuiApplication为有GUI界面的应用程序提供流控制和主要的设定
QGuiApplication的子类QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等

QCoreApplication的一些函数,如QString applicationDirPath(),QString applicationFilePath(),QString applicationName(),QStringList libraryPaths(),void setOrganizationName(QString&),QString organizationName(),void exit()

QFile类

除了打开文件提供读写操作外,QFile还有一些静态函数和成员函数用于文件操作
QFile的一些静态函数
bool copy(...),bool rename(...),bool remove(...),bool exists(...),bool setPermissions(...),Permissions permissions(...)

QFile的一些成员函数
void setFileName(...),bool copy(...),bool rename(...),bool remove(),bool exists(),bool setPermissions(...),Permissions permissions(),qint64 size()

QFileInfo

创建时可指定一个文件名作为当前文件,也可用setFile指定
QFileInfo的一些函数
void setFile(...),QString absoluteFilePath(),QString absolutePath(),QString fileName(),QString filePath(),QString path(),qint64 size(),QString baseName(),QString completeBaseName(),QString suffix(),QString completeSuffix(),bool isDir(),bool isFile(),bool isExecutable(),QDateTime lastModified(),QDateTime lastRead(),bool exist(),boo exists(QString&)

QDir

QDir是进行目录操作的类
在创建QDir对象时传递一个目录字符串作为当前目录
QDir可针对当前目录或其下文件操作
QDir的一些静态函数,如QString tempPath(),QString rootPath(),QString homePath(),QString currentPath(),bool setCurrent(...),QFileInfoList drives()

QDir的一些成员函数.如QString absoluteFilePath(...),QString absolutePath(),QString canonicalPath(),QString filePath(...),QString dirName(),bool exist(),QStringList entryList(...),bool mkdir(...),bool rmdir(...),bool remove(...),bool rename(...),void setPath(...),bool removeRecursively()

QDir::Filter支持 QDir::AllDirs, QDir::Files, QDir::Drives, QDir::NoDotAndDotDot(), QDir::AllEntries

QTemporaryDir和QTemporaryFile

QTemporaryDir是用于创建,删除临时目录的类
QTemporaryDir的一些成员函数,如void setAutoRemoved(...),QString path(),bool remove()

在系统临时目录,即QDir::tempPath目录下创建一个临时目录
临时目录名称以QCoreApplication::applicationName()为前缀,后加个字符
QTemporaryFile是用于创建临时文件的类
临时文件保存在系统临时目录下,
临时文件以QCoreApplication::applicationName()作为文件名
XXXXXX 6个随机数字作为文件后缀
QTemporaryFilevoid setAutoRemove()设置为是否自动删除临时文件,void open(...) 创建文件

QFileSystemWatcher

对目录和文件进行监听
把某些目录或文件添加到QFileSystemWacher对象的监听列表后,
当目录下发生文件新建,删除等会发射fileChanged信号
QFileSystemWatcher的成员函数,如bool addPath(...),QStringList addPaths(...),QStringList directories(),QStringList files(),bool removePath(...),QStringList removePaths(...)

QFileSystemWatcher有两个信号,分别是目录变化和文件变化时发射的信号.如void directoryChanged(...),void fileChanged(...)

QObject::connect建立信号与信号,信号与槽的关联
QObject::disconnect取消信号与信号,信号与槽的关联

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

raindayinrain

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

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

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

打赏作者

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

抵扣说明:

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

余额充值