第九章 Qt之文件、目录和输入输出
11.1 文件和目录
11.1.1 输入/输出设备
QIODevice类是Qt中所有I/O设备的基础接口类,为QFile、QBuffer和QTcpSocket等支持读/写数据块的设备提供了一个抽象接口。QIODevice类是抽象类,无法被实例化,一般是使用它所定义的接口来提供设备无关的I/O功能。
- 使用设备前,需要使用open()函数打开设备,而且必须指定正确的打开模式
- 打开设备后可以使用write()或putChar()进行写入
- 使用read()、readLine()或者readAll()进行读取
- 最后使用close()关闭设备

QIODevice会区分两种类型的设备:随机存取设备和顺序存储设备:
-
通过isSequential()函数判断设备的类型
-
随机存取设备支持使用seek()函数来定位到任意的位置,文件中的当前位置可以使用pos()函数获取,这样的设备有QFile、QBuffer等
-
顺序存储设备不支持定位到任意的位置,数据必须一次性读取。pos()和size()等函数无法使用,这样的设备有QTcpSocket、QProcess等
子类化QIODevice为自己的I/O设备提供相同的接口
- 重新实现readData()和wirteData()函数
- 一些设备通过缓冲区操作能够快速完成数据的写入和读取,同时一些设备使用缓冲区无法很好的工作,可以在open时指定QIODevice::Unbuffered模式绕过所有缓冲区
11.1.2 文件操作
a)文件 QFile
QFile类提供了一个用于读/写文件的接口,它是一个可以用来读写文本文件、二进制文件和Qt资源的I/O设备,可以结合QTextStream和QDataStream使用。
/*构建QFile对象时可以直接指定文件名
setFileName()函数进行文件设置
exists()检查文件是否存在
remove()删除一个文件
flush()用于刷新文件
seek()定位文件的任意位置
pos()获取当前的位置
atEnd()判断是否到达文件末尾*/
b)文件信息 QFileInfo
QFileInfo类提供了与系统无关的文件信息,包括文件名称、在文件系统中的位置(路径)、文件的访问权限以及是否是一个目录或者符号连接、获取文件的大小、最近一次修改/读取的时间以及获取Qt资源的相关信息。
/*QFileInfo使用相对路径(ralative)或者绝对路径(absolute)指定一个文件;可以使用isRelative()函数判断QFileInfo对象使用路径方式
使用makeAbsolute()来将一个相对路径转换为绝对路径
setFile()用于指定一个文件
exists()查看文件是否存在
size()获取文件的大小
isFile()、isDir()、isSymLink()获取文件的类型
symLinkTarget()函数返回符号链接指向的文件名称
使用path()获取文件路径
使用fileName()获取文件的名称
baseName()获取文件名中基本名称
suffix()获取文件的后缀
completeSuffix()获取复合后缀
created()、lastModified()、lastRead()获取文件的创建、最后一次修改、和最后一次读取的日期
isReadable()、isWritable()、isExecutable()获取文件的权限
owner()、ownerId()、group()和groupId()获取文件的所有权
permission()获取文件的访问权限和所有权*/
c)临时文件 QTemporaryFile
QTemporaryFile类是一个用来操作临时文件的I/O设备,它可以安全地创建一个唯一地临时文件,当调用open()函数时便会创建一个临时文件,临时文件地文件名可以保证是唯一的,当销毁掉对象时,该文件也会被自动删除掉,同时,打开文件地属性默认为可读写模式。
QTemporaryFile file;
if(file.open()){
//对临时文件进行操作,file.fileName()获取唯一的文件名
}
file.close(); //只要对象没有被销毁,则该文件一直存在;临时文件的位置在系统的临时目录中,通过QDir::tempPath()获得该路径
11.1.3 目录操作
a)目录Dir
QDir类用来访问目录结构及其内容,可以操作路径名、访问路径和文件相关信息、操作底层的文件系统,还可以访问Qt的资源系统。Qt使用”/“作为通用的目录分隔符和URLs的目录分隔符。
- 目录中包含如文件、目录和符号链接等条目
/*
isRelative()和isAbsolute()判断一个QDir是否使用了相对路径或者绝对路径
makeAbsolute()将一个相对路径转换为绝对路径
path()获取一个目录的路径,absolutePath()获取绝对路径
setPath()设置新的路径
dirName()获取目录名,返回绝对路径的最后一个元素,当前文件则显示”.“
cd()和cdUp()改变路径,后者跳转到父目录
mkdir()创建目录
rename()重命名
rmdir()删除目录
exists()检测指定的目录是否存在
isReadable()和isRoot()测试目录的属性
refresh()重新堆区目录的数据
count()获取目录下的条目数
entryList()获取所有条数的名称列表
entryInfoList()函数获取一个QFileInfo对象的列表
remove()移除目录下的指定文件
setNameFilters(QstringList &filters)函数用于设置一个目录名称过滤器
setFilter()设置过滤器的属性
setSorting()用于排序设置
*/
b)文件系统监视器 QFileSystemWatcher
QFileSystemWatcher类提供了一个接口用来监控文件和目录的修改,通过监视一个指定路径的列表来监控文件系统中文件和目录的改变
- 当文件被修改、重命名或移除,会发射fileChanged()信号
- 当目录或者其内容被修改或者移除后,会发射directoryChanged()信号
- 当被监视的文件被重命名或移除、当监视的目录被移除后,文件系统监视器会停止监视
/*
addPath()监视一个指定的文件和目录,多个路径可以使用addPaths()
removePath()、removePaths()用于移除现有的路径
files()获取监视器监视的文件路径
directories()获取监视器监视的目录路径
*/
11.2 文本流和数据流
QTextStream类是提供了一个方便的 接口来读写文本,可以在QIODevice、QByteArray和QString上进行操作。使用QTextStream的流操作符可以方便地读写单词、行和数字。对于生成文本,QTextStream对字段填充、对齐和数字格式提供了格式选项支持。
11.2.1 使用文本流读/写文本文件
使用QTextStream来读取文本文件的3种方式
- 调用readLine() or readAll()进行一块接着一块的读取
- 一个单词接着一个单词。QTextStream支持流入到QString、QByteArray和char*缓冲区,单词由空格分开,并且可以自动跳过前导空格
- 一个字符接着一个字符。使用QChar或者char类型的流。这种方式经常在解析文件、使用独立的字符编码和行结束语义时用于方便输入处理。可以通过调用skipWhiteSpace()跳过空格。
默认当从文本流中读取数字时,QTextStream会自动检测数字的基数表示(进制)。也可以使用dec等流操作符或者setIntegerBase()来设置整数基数,停止自动检测。
11.2.2 使用数据流读/写二进制数据
QDataStream类实现了将QIODevice的二进制数据串行化。一个数据流就是一个二进制编码信息流,数据流也可以读写未编码的原始二进制数据。QDataStram类可以实现C++基本数据类型的串行化,比如char、short、int和char*等
11.3 其他相关类
11.3.1 应用程序设置
QSettings类提供了持久的、与平台无关的应用程序设置,比如:窗口的大小和位置等
- windows中这些信息一般被存储在系统注册表中
- Mac OS X上存储在XML偏好文件上
- Unix系统中,大多数应用程序使用INI文件保存
11.3.2 统一资源定位符
QUrl
11.3.3 Qt资源
11.3.4 缓冲区
QBuffer类为QByteArray提供了一个QIODevice接口,它允许使用QIODevice接口来访问QByteArray,这里QByteArray被视为一个标准的随机访问的文件。默认的,创建一个QBuffer时,则自动在内部创建一个QByteArray缓冲区,可以直接调用buffer()来访问这个缓冲区
- 当有新的数据到达了缓冲区时,QBuffer会发射readyRead()信号
浙公网安备 33010602011771号