第十五章 文件、目录和输入与输出——Qt

一、文件和目录

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被视为一个标准的随机访问的文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值