一、文件和目录
1.输入和输出设备
QIODevice类是Qt中所有I/O设备的基础接口类,为诸如QFile、QBuffer和QTcpSocket等支持读写数据块的设备提供了一个抽象接口。
操作:open()打开设备——write()或者putChar()写入——read()、readLine()或者readAll()读取——close()关闭设备
打开的模式
——————————————————————————————————————————————————————————————————————————————————————————————————————
常量 |描述
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::NotOpen |设备没有打开
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::ReadOnly |设备以只读方式打开,这是无法写入
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::WriteOnly |设备以只写方式打开,这是无法读取
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::ReadWrite |设备以读/写方式打开
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::Append |设备以附加模式打开,所有的数据都将写入到文件的末尾
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::Truncate |如果可能,设备在打开前会被截断,设备先前的所有内容都将消失
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::Text |当读取时,行结尾终止会被转换为“\n”;当写入时,行结尾终止符会被转换为本地编码
————————————————————————|—————————————————————————————————————————————————————————————————————————————
QIODevice::Unbuffered |绕过设备所有的缓冲区
——————————————————————————————————————————————————————————————————————————————————————————————————————
QIODevice会区别两种类型的设备:随机存取设备和顺序存储设备。( 可以使用isSequential()函数来判断设备的类型 )
- 随机存取设备支持使用seek()函数来定位到任意的位置。
- 顺序存储设备不支持定位到任意的位置,数据必须一次性读取。
2.文件操作
(1)文件QFile
QFile类提供了一个用于读写文件的接口,它是一个可以用来读写文本文件、二进制文件和Qt资源的I/O设备。
说明:
- 一般在构建QFile对象时便指定文件名,然也可以使用setFileName()进行设置。
- 文件名路径中的文件分隔符都需要使用‘/’符号。
- 可以使用exists()来检查文件是否存在,remove()来删除一个文件。
- 一个文件可以使用open()打开,使用close()关闭,使用flush()刷新。
- 可以使用size()函数来获取文件的大小,使用seek()来定位到文件的任意位置,
使用pos()来获取当前的位置,使用atEnd()来判断是否到达了文件的末尾。
(2)文件信息QFileInfo
QFileInfo类提供了与系统无关的文件信息,包括文件的名称、在文件系统中的位置(路径)、文件的访问权限以及是否是一个目录或者符号链接等。
说明:
- 可以使用相对(relative)路径或者绝对(absolute)路径来指向一个文件,还可以使用makeAbsolute()来将一个相对路径转换为绝对路径。
- 指向的文件可以在QFileInfo对象构建时设置,或者在以后使用setFile()来设置。
- 可以使用exists()来查看文件是否存在,使用size()可以获取文件的大小。
- 文件的类型可以使用isFile()、isDir()和isSymLink()来获取。
- 可以分别使用path()和fileName()来获取文件的路径和文件名,
- 还可以使用baseName()来获取文件名中的基本名称,使用suffix()来获取文件名的后缀,使用completeSuffix()来获取复合后缀。
- 文件的日期可以使用created()、lastModified()和lastRead()来返回;
- 访问权限可以使用isReadable()、isWritable()和isExecutable()来获取;
- 文件的所有权可以使用owner()、ownerId()、group()和groupId()来获取。
(3)临时文件QTemporaryFile
QTemporaryFile类是一个用来操作临时文件的I/O设备,它可以安全地创建一个唯一的临时文件。
说明:
- 当调用open()函数时便会创建一个临时文件,临时文件的文件名可以保证是唯一的,当销毁QTemporaryFile对象时,该文件会被自动删除掉。
- 在调用open()函数时,默认会使用QIODevice::ReadWrite模式。
- 调用了close()函数后重新打开QTemporaryFile是安全的,只要QTemporaryFile的对象没有被销毁,那么唯一的临时文件就会一直存在而且由QTemporaryFile内部保持打开。
- 临时文件默认会生成在系统的临时目录里,这个目录的路径可以使用QDir::tempPath()来获取。
3.目录操作
(1)目录QDir
QDir类用来访问目录结构及其内容,可以操作路径名、访问路径和文件相关信息以及操作底层的文件系统,还可以访问Qt的资源系统。
说明:
-
Qt使用“/”作为通用的目录分隔符和URLs的目录分隔符,如果使用“/”作为目录分隔符,Qt会自动转换路径来适应底层的操作系统。
-
目录的路径可以使用path()函数获取,使用setPath()函数可以设置新的路径,使用absolutePath()函数可以获取绝对路径。
-
目录名可以使用dirName()函数获取,如果QDir代表当前目录,那么会返回“.”。
-
目录的路径也可以使用cd()和cdUp()函数来改变,当使用一个存在的目录的名字来调用cd()后,QDir对象就会转换到指定的目录;而cdUp()会跳转到父目录。
-
可以使用mkdir()来创建目录,使用rename()进行重命名,使用rmdir()删除目录。
-
可以使用exists()函数来测试指定的目录是否存在,使用isReadable()和isRoot()等函数来测试目录的属性。
-
使用refresh()函数可以重新读取目录的数据。
-
可以应用一个名称过滤器(name filters)来使用通配符(wildcards)指定一个模式进行文件名的匹配,一个属性过滤器可以选取条目的属性并且可以区分文件和目录,还可以设定排序顺序。
-
要访问一些常见的目录,可以使用一些静态函数来完成,它们可以返回QDir对象或者QString类型的绝对路径,
这些函数如下:返回类型QDir 返回类型QString 返回值 current() currentPath() 应用程序的工作目录 home() homePath() 用户的home目录 root() rootPath() root跟目录 temp() tempPath() 系统存放临时文件的目录
(2)文件系统监控器QFileSystemWatcher
QFileSystemWatcher类提供了一个接口用来监控文件和目录的修改,通过监视一个指定路径的列表来监控文件系统中文件和目录的改变。
说明:
- 调用addPath()来监视一个指定的文件或者目录,多个路径可以使用addPaths()函数来添加,现有的路径可以使用removePath()和removePaths()函数来移除。
- 添加的文件的路径可以使用files()来获取,目录的路径可以使用directories()函数来获取。
- 当文件被修改、重命名或者移除后,会发射fileChanged()信号;当目录或者它的内容被修改或者移除后,会发射directoryChanged()信号。
- 当文件被重命名或者移除后,或者当目录被移除后,QFileSystemWatcher都会停止监视。
二、文本流和数据流
1.使用文本流读/写文本文件
QTextStream类提供了一个方便的接口来读/写文本,可以在QIODevice、QByteArray和QString上进行操作。
说明:
- 在内部,QTextStream使用了一个基于Unicode的缓冲区,QTextStream使用QTextCodec来自动支持不同的字符集。
- 可以使用setDevice()或者setString()来设置QTextStream要操作的设备或者字符串。
- 使用seek()来判定位到一个指定位置,使用atEnd()判断是否还有可以读取的数据。
- 如果调用了flush()函数,则QTextStream会清空写缓冲中的所有数据,并且调用设备的flush()函数。
- 使用QTextStream来读取文本文件一般使用三种方式:
- 调用readLine()或者readAll()进行一块接着一块的读取;
- 一个单词接着一个单词。
- 一个字符接着一个字符,使用QChar或者char类型的流。
2.所有数据流读/写二进制数据
QDataStream类实现了将QIODevice的二进制数据串行化。
说明:
个数据流就是一个二进制编码信息流,数据流也可以读/写未编码的原始二进制数据。
三、其他相关类
1.应用程序设置
QSettings类提供了持久的与平台无关的应用程序设置。
说明略。
2.统一资源定位符
QUrl类提供了一个方便的接口来操作URLs,URL是Uniform Resource Locator的缩写,被称为统一资源定位符或者网页网址。
一个URL的标准格式如下:
protocol :// hostname[:port] / path / [?query]#fragment
参数:
protocol:用来指定传输协议;
hostname:用来指定存放资源的服务器的域名系统主机名或者IP地址,主机名前面还可以包含连接服务器所需要的用户名和密码;
port:用来指定端口号,可选,省略时使用默认的端口号;
path:用来指定主机上的目录或者文件地址,路径中可以使用“/”分隔符;
query:用来设置查询参数,可选,参数间使用“&”符号隔开;
fragment:用来指定网络资源中的片断。
说明:
- QUrl可以解析和构建编码或者未编码格式的URLs,它也支持国际化域名(IDNs)。
- 可以在构造函数中传递一个QString来初始化QUrl,或者使用setUrl()和setEncodedUrl()。
- URLs可以被表示为两种格式,编码和未编码:为编码的格式适合向用户展示,而编码格式一般用于发送到web服务器。
- 一个URL也可以被一部分一部分的进行构造:
- 使用setScheme()来设置协议;
- 使用setUserName()来设置用户名;
- 使用setPassword()来设置密码;
- 使用setHost()来设置主机;
- 使用setPort()来设置端口;
- 使用setPath()来设置路径;
- 使用setEncodedQuery()来设置查询字符串;
- 使用setFragment()来设置片断。
- 使用setAuthority()可以一次性设置用户名、密码、主机和端口;
- 使用setUserInfo()可以一次性设置用户名和密码。
3.Qt资源
QResource类提供了接口来直接读取资源文件。
说明:
- QResource是用来表示一组数据的对象,该组数据涉及了一个单一的资源实体。
- QResource可以使用原始的格式来直接访问字节,这种直接访问允许不使用缓冲拷贝。
- QResource也可以使用一个绝对路径进行加载,绝对路径可以使用文件系统的表示法:
- 以一个“/”字符开始,或者使用资源表示法,
- 以“:”字符开始。
- QResource代表的文件中的数据可以使用qCompress()来进行压缩,对应的使用qUncompress()来进行解压缩。
- 一个资源可以留在一个应用程序的二进制文件外面,等在运行需要时再使用registerResource()进行加载,传递给registerResource()的资源文件必须是rcc生成的二进制资源。
4.缓冲区
QBuffer类为QByteArray提供了一个QIODevice接口,它允许使用QIODevice接口来访问QByteArray,这里QByteArray被视为一个标准的随机访问的文件。