1 介绍
QT的文件操作来源于其抽象基类QIODevice,中用于处理输入输出设备。提供了统一的接口来处理不同类型的数据源,如文件、套接字、缓冲区等。QIODevice 主要用于读取和写入数据,无论数据来自何种源头,都可以通过 QIODevice 统一地进行处理。
2 成员函数和用法
2.1 成员函数
打开和关闭: 通过
open(QIODevice::OpenMode mode)函数可以打开QIODevice,并且需要指定打开的模式,如只读、只写、读写等。关闭QIODevice可以使用close()函数。
读取和写入数据: 使用
read(char *data, qint64 maxSize)函数从QIODevice中读取数据,将读取的数据存储在data缓冲区中,最大读取量为maxSize。使用write(const char *data, qint64 maxSize)函数将数据写入QIODevice。
位置和移动: 通过
pos()函数可以获取当前的读写位置,通过seek(qint64 pos)函数可以移动到指定的读写位置。
判断状态: 可以使用
atEnd()函数判断是否已经读取到QIODevice的末尾。还可以使用error()函数判断是否出现了读写错误。
模式和标志:
QIODevice可以以不同的模式打开,如文本模式和二进制模式。可以使用QIODevice::Text或QIODevice::Binary标志来设置。
继承和用法:
QIODevice是一个抽象基类,许多与输入输出相关的类都继承自它,如QFile、QTcpSocket、QBuffer等。你可以根据具体的需求选择合适的派生类进行文件、网络通信或内存数据的读写操作。
2.2 用法
            
            
              cpp
              
              
            
          
          #include <QCoreApplication>
#include <QBuffer>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 创建一个 QBuffer 对象,用于读写内存数据
    QBuffer buffer;
    buffer.open(QIODevice::ReadWrite); // 打开为读写模式
    // 写入数据到缓冲区
    QByteArray data = "Hello, QIODevice!";
    buffer.write(data);
    // 移动读写位置到开头
    buffer.seek(0);
    // 从缓冲区读取数据
    QByteArray readData = buffer.readAll();
    qDebug() << "Read data: " << readData;
    return a.exec();
}3 QCoreApplication
QCoreApplication是 Qt 框架中用于管理应用程序的基础类,它提供了应用程序事件循环、事件处理和应用程序配置等功能。所有使用 Qt 编写的应用程序都需要至少一个 QCoreApplication 对象作为应用程序的核心。
应用程序的启动和退出: 、静态函数
int exec()来、启动应用程序的事件循环,这个函数将一直运行,直到应用程序退出。使用void quit()函数来退出事件循环,终止应用程序。
事件处理: 通过
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)函数可以向指定的对象发送事件。也可以通过bool QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)在事件队列中插入一个事件。
应用程序信息: 可以使用
QString QCoreApplication::applicationDirPath()获取应用程序所在的目录路径,使用QString QCoreApplication::applicationFilePath()获取应用程序的完整路径,使用QString QCoreApplication::applicationName()获取应用程序的名称等。
命令行参数: 可以通过
QStringList QCoreApplication::arguments()获取应用程序的命令行参数列表。
应用程序类型: Qt 提供了不同类型的应用程序类,如
QGuiApplication用于 GUI 应用程序,QCoreApplication用于非 GUI 应用程序等。
4 QIODevice派生类介绍
当涉及到文件和目录操作时,Qt 提供了一组方便的类来处理,包括 `QFile`、`QFileInfo`、`QDir`、`QTemporaryFile` 和 `QFileSystemWatcher`。
- `QFile` 文件的读写操作:提供了打开、关闭、读取、写入和修改文件等功能。可以使用 `QFile` 来处理二进制和文本文件。
2.`QFileInfo` 提供了关于文件和目录的元信息 。用来获取文件的属性、路径、扩展名、大小等信息,以及判断文件是否存在、是否可读、是否可写等。
`QDir` 用于操作目录 ,提供了遍历目录、创建目录、删除目录、列出目录中的文件等功能。还可以用于文件路径的拼接、判断文件是否存在等。
`QTemporaryFile` 用于创建临时文件,临时文件通常在程序运行结束后自动删除。它继承自 `QFile`,提供了创建、打开临时文件的功能。
`QFileSystemWatcher` 可以监视文件和目录的变化,比如文件的创建、删除、修改等。当所监视的文件或目录发生变化时,`QFileSystemWatcher` 会发出相应的信号。
示例:使用这些类进行文件和目录操作:
            
            
              cpp
              
              
            
          
          ```cpp
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QTemporaryFile>
#include <QFileSystemWatcher>
#include <QDebug>
int main(int argc, char *argv[])
{
    Q_UNUSED(argc);
    Q_UNUSED(argv);
    // 使用 QFile 进行文件读写操作
    QFile file("example.txt");
    if (file.open(QIODevice::ReadWrite)) {
        file.write("Hello, QFile!");
        file.close();
    }
    // 使用 QFileInfo 获取文件信息
    QFileInfo fileInfo("example.txt");
    qDebug() << "File size:" << fileInfo.size() << "bytes";
    qDebug() << "File path:" << fileInfo.filePath();
    qDebug() << "Is file readable:" << fileInfo.isReadable();
    // 使用 QDir 进行目录操作
    QDir dir(".");
    QStringList fileList = dir.entryList(QDir::Files);
    qDebug() << "Files in current directory:" << fileList;
    // 使用 QTemporaryFile 创建临时文件
    QTemporaryFile tempFile;
    if (tempFile.open()) {
        tempFile.write("Temporary content");
        tempFile.setAutoRemove(true); // 设置临时文件在关闭时自动删除
    }
    // 使用 QFileSystemWatcher 监视文件变化
    QFileSystemWatcher watcher;
    watcher.addPath("example.txt");
    QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [](const QString &path) {
        qDebug() << "File changed:" << path;
    });
    return 0;
}
```