文件系统和文件读写
本章介绍Qt
中如何实现文本文件,二进制文件的读写,及文件和目录的管理功能
文本文件读写
实例功能概述
Qt
提供了两种读写纯文本文件的基本方法
一种是用QFile
类的IODevice
读写功能直接进行读写
另一种是利用QFile
和QTextStream
结合,用流的方法进行文件读写
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结合读写文本文件
QTextStream
与IO
读写设备结合
为数据读写提供了一些方便的方法的类
QTextStream
可与QFile, QTemporaryFile, QBuffer, QTcpSocket, QUdpSocket
等IO
设备类结合使用
对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
使用QFile
和QDataStream
进行二进制数据文件的读写
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
用于提取目录或文件信息,
获取目录下的文件或目录列表,创建,删除目录和文件,文件重命名等
- 对QTemporaryDir
和QTemporaryFile
用于创建临时目录和临时文件
- 对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()
为前缀,后加6
个字符
QTemporaryFile
是用于创建临时文件的类
临时文件保存在系统临时目录下,
临时文件以QCoreApplication::applicationName()
作为文件名
以XXXXXX 6
个随机数字作为文件后缀
对QTemporaryFile
,void 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
取消信号与信号,信号与槽的关联