添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首页 Qt 学习之路 2 Qt 学习之路 2(35):文件

Qt 学习之路 2(35):文件

12 3.4K
3.4K

文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。从本章开始,我们来了解下 Qt 的文件以及输入输出的功能,也就是 I/O 系统。

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

Qt4

Qt4 IO 设备类图

Qt5

Qt5 IO 设备类图

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

  • QIODevice :所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
  • QFlie :访问本地文件或者嵌入资源;
  • QTemporaryFile :创建和访问本地文件系统的临时文件;
  • QBuffer :读写 QByteArray
  • QProcess :运行外部程序,处理进程间通讯;
  • QAbstractSocket :所有套接字类的父类;
  • QTcpSocket:TCP 协议网络数据传输;
  • QUdpSocket :传输 UDP 报文;
  • QSslSocket :使用 SSL/TLS 传输数据;
  • QFileDevice:Qt5 新增加的类,提供了有关文件操作的通用实现。

这其中, QProcess QTcpSocket QUdpSoctet QSslSocket 是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节; QFile QTemporaryFile QBuffer 是随机访问设备,可以访问任意位置任意次数,还可以使用 QIODevice::seek() 函数来重新定位文件访问位置指针。

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

在所有的 I/O 设备中,文件 I/O 是最重要的部分之一。因为我们大多数的程序依旧需要首先访问本地文件(当然,在云计算大行其道的将来,这一观点可能改变)。 QFile 提供了从文件中读取和写入数据的能力。Qt5 新加入的 QFileDevice 类,则将这部分公共操作放到了这个单独的类中。显然,这部分代码在 Qt4 中位于 QFile 类。这样看来,Qt5 的代码结构更为清晰,层次更好。

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

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

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

int main(int argc, char *argv[])
    QApplication app(argc, argv);
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Open file failed.";
        return -1;
    } else {
        while (!file.atEnd()) {
            qDebug() << file.readLine();
    QFileInfo info(file);
    qDebug() << info.isDir();
    qDebug() << info.isExecutable();
    qDebug() << info.baseName();
    qDebug() << info.completeBaseName();
    qDebug() << info.suffix();
    qDebug() << info.completeSuffix();
    return app.exec();