Qt 通过提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图:

    Qt4

    Qt5 IO 设备类图

    从上面的类图可以看出,Qt4 和 Qt5 在 I/O 设备部分大同小异。只不过 Qt5 新增加了一个QFileDevice类。途中所涉及的类及其用途简要说明如下:

    • QFlie:访问本地文件或者嵌入资源;
    • QTemporaryFile:创建和访问本地文件系统的临时文件;
    • QBuffer:读写QByteArray
    • QProcess:运行外部程序,处理进程间通讯;
    • QTcpSocket:TCP协议网络数据传输;
    • QUdpSocket:传输 UDP 报文;
    • QSslSocket:使用 SSL/TLS 传输数据;
    • QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
      这其中,QProcessQTcpSocketQUdpSoctetQSslSocket是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节;QFile、和QBuffer是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针。

    本章将主要介绍QFile及其相关类,后面的章节则开始介绍有关输入输出的流。

    我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。QFile需要使用 / 作为文件分隔符,不过,它会自动将其转换成操作系统所需要的形式。例如 C:/windows 这样的路径在 Windows 平台下同样是可以的。

    QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStreamQTextStream类来读写文件,也可以使用QIODevice类提供的read()readLine()readAll()以及write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过获取,而不是自己分析文件路径字符串。

    下面我们使用一段代码来看看QFile的有关操作:

    程序的第二部分,我们使用QFileInfo获取有关该文件的信息。QFileInfo有很多类型的函数,我们只举出一些例子。比如这里,isDir()检查该文件是否是目录;isExecutable()检查该文件是否是可执行文件等。baseName()可以直接获得文件名;suffix()则直接获取文件后缀名。我们可以由下面的示例看到,baseName()completeBaseName(),以及suffix()和的区别:

    1. QString base = fi.baseName(); // base = "archive"
    2. QString cbase = fi.completeBaseName(); // base = "archive.tar"
    3. QString ext = fi.suffix(); // ext = "gz"
    4. QString ext = fi.completeSuffix(); // ext = "tar.gz"