【Qt笔记】文件

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

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

图中所涉及的类及其用途简要说明以下:app

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

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

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

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

咱们一般会将文件路径做为参数传给QFile的构造函数。不过也能够在建立好对象最后,使用setFileName()来修改。QFile须要使用 / 做为文件分隔符,不过,它会自动将其转换成操做系统所须要的形式。例如 C:/windows 这样的路径在 Windows 平台下一样是能够的。指针

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

下面咱们使用一段代码来看看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();
}

 

在这段代码中,咱们首先使用QFile建立了一个文件对象。这个文件名字是 in.txt。若是你不知道应该把它放在哪里,可使用app.applicationFilePath();或者app.applicationDirPath();来得到应用程序的执行路径。只要将这个文件放在同执行路径一致的目录下便可。可使用QDir::currentPath()来得到应用程序执行时的当前路径。只要将这个文件放在与当前路径一致的目录下便可。而后,咱们使用open()函数打开这个文件,打开形式是只读方式,文本格式。这个相似于fopen()的 r 这样的参数。open()函数返回一个 bool 类型,若是打开失败,咱们在控制台输出一段提示而后程序退出。不然,咱们利用 while 循环,将每一行读到的内容输出。接口

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

QFileInfo fi("/tmp/archive.tar.gz");
QString base  = fi.baseName();  // base = "archive"
QString cbase = fi.completeBaseName();  // base = "archive.tar"
QString ext   = fi.suffix();  // ext = "gz"
QString ext   = fi.completeSuffix();  // ext = "tar.gz"
相关文章
相关标签/搜索