介绍

QFile是Qt中提供的文件I/O操作类,它支持在Windows、MacOS和Linux等操作系统下操作文件。使用QFile可以方便地读取、写入和处理文件,同时还能检查文件的大小、相关属性和状态等。

QFile是一个非常重要的类,它提供了I/O操作文件的基本功能,可以轻松读写数据,并提供许多与文件相关的工具函数 ,同时还支持跟踪文件系统中文件内容的变化。因此,在Qt编程过程中,QFile是不可或缺的一个类

作用

具体来说,QFile类可以完成以下功能:

  1. 文件的打开和关闭:使用QFile,可以通过open()函数以指定模式打开文件,并使用close()函数关闭文件。

  2. 读取和写入文件数据:使用QFile进行文件读写操作时,可以首先使用seek()函数移动文件指针的位置,然后使用read()或write()函数读取或写入文件中的数据。此外,为了更加方便灵活地读取和写入文件的内容,也可以使用QTextStream类。

  3. 处理文件中的位置和大小:QFile提供许多用于管理文件指针位置和文件大小的函数,如pos(),size()和atEnd()函数。通过这些函数可以得到文件指针的当前位置、文件的总大小以及判断文件是否被读取完。

  4. 查询文件及其相关属性:除了读写文件,还可以使用QFile查询文件及其相关属性,比如exists()、isReadable()、isWritable()等函数,分别用于检查文件是否存在、文件是否可读、文件是否可写等信息。

  5. 监听文件内容变化:通过调用QFileSystemWatcher监视文件,并连接相应的信号和槽,可以实现监听文件内容的变化,并在发生变化时采取相应的行动。

接口

QFile是Qt中用于对文件进行基本I/O操作的类。其接口函数提供了丰富的功能,包括:

  1. open():以指定的模式打开文件,支持多种打开模式。如QIODevice::ReadOnly表示只读模式,QIODevice::WriteOnly表示只写模式,QIODevice::Append表示追加模式等等。返回值为布尔类型,表示是否打开成功。

  2. close():关闭当前已打开的文件。

  3. read()和write():分别用于从文件中读取数据和向文件中写入数据。read()函数具有多个重载版本,可以通过指定参数来实现按字节数读取、按行读取、读取全部内容等不同功能。

  4. seek():用于跳转文件读写指针位置。常见的用法是将指针移动到文件开头或结尾,以获取文件大小或检查文件结束标志,也可以指定要跳转到的具体位置。

  5. atEnd():查询当前文件指针是否已到达文件末尾。

  6. pos()和size():pos()函数返回当前文件指针所在的位置,size()函数返回文件的总大小。

  7. flush():刷新文件缓存,确保写入的内容已经被写入到文件中。

  8. error():返回文件操作过程中发生的错误代码。如果没有出错则返回QFile::NoError。

  9. fileName():返回当前文件的文件名。

  10. exists()、isReadable()、isWritable()、isExecutable():查询当前文件是否存在、是否可读、是否可写、是否可执行等信息。这些函数的返回值均为布尔类型。

QFile还有一些其他的接口函数,比如isSequential()(判断当前文件是否是顺序访问),setPermissions()(设置文件权限)等等。总体来说,QFile提供了一整套丰富的接口函数,方便用户进行文件的读写以及管理。

使用示例

以下代码演示了文件的打开、写入、读取、关闭,以及文件信息输出等基本用法。

#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <QDateTime>
#include <QTextStream>
#include <QFileInfo>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString file_path = "test.txt";
    QFile my_file(file_path); // 实例化QFile对象

    if(!my_file.open(QIODevice::ReadWrite | QIODevice::Text |QIODevice::Append))
    {
        qDebug() << "Open file failed.";
        return -1;
    }
    else
    {
        qDebug() << "Open file success.";
    }

#if 0
    // 写入文件
    QString content = "Hello World!";
    if(my_file.write(content.toStdString().c_str()) == -1)
    {
        qDebug() << "Write file failed.";
    }
#endif

    // 写入文件
    QString content2 = "Hello Qt!";
    QTextStream out(&my_file);
    out << content2;
    my_file.flush();

    // 跳转到文件开头
    my_file.seek(0);
    // 读取文件内容
    QByteArray data = my_file.readAll();
    qDebug() << "Read from file:" << data;

    // 跳转到文件开头
    my_file.seek(0);
    // 读取文件内容
    QTextStream in(&my_file);
    QString strData = in.readAll();
    qDebug() << "Read All:" << strData;

    // 跳转到文件开头
    my_file.seek(0);
    // 读取文件内容
    while (!my_file.atEnd()) {
        QByteArray line = my_file.readLine();
        qDebug() << "readLine:" << line;
    }

    // 获取当前文件指针位置
    qint64 pos = my_file.pos();
    qDebug() << "Current position is:" << pos;

    // 获取文件大小
    qint64 size = my_file.size();
    qDebug() << "File size is:" << size;

    QFileInfo file_info(my_file);
    qDebug() << "File name: " << file_info.fileName();
    qDebug() << "Path: " << file_info.path();
    qDebug() << "Owner: " << file_info.owner();
    qDebug() << "Creation time: " << file_info.created();
    qDebug() << "Last modified time: " << file_info.lastModified();
    qDebug() << "Is readable: " << file_info.isReadable();
    qDebug() << "Is writable: " << file_info.isWritable();
    qDebug() << "Is executable: " << file_info.isExecutable();

    my_file.close();

    return a.exec();
}

代码输出内容:
11:27:36: Starting /home/guo/build-File-Desktop_Qt_5_15_2_GCC_64bit-Debug/File...
Open file success.
Read from file: "Hello World!"
Read All: "Hello World!"
readLine: "Hello World!"
Current position is: 12
File size is: 12
File name:  "test.txt"
Path:  "."
Owner:  "guo"
Creation time:  QDateTime(2023-06-04 11:27:36.967 CST Qt::LocalTime)
Last modified time:  QDateTime(2023-06-04 11:27:36.967 CST Qt::LocalTime)
Is readable:  true
Is writable:  true
Is executable:  false

06-05 12:23