第一天复习Qt文件读取

发布于:2024-05-10 ⋅ 阅读:(27) ⋅ 点赞:(0)

Qt文件操作:

1、QFile QTextStream操作文件案例:
1、打开文件
QFile file(absolute filepath | relative path);
file.readLine()返回内容长度,如果为-1就是读取失败
file. Close()读取后关闭
file.errorString()返回文件打开发生的错误
2、文件写入
    //文件写入
    double dPi = 3.1415926;
    int age = 13;
    QFile dataFile;
    dataFile.setFileName(R"(P:\Qt_study_rebegin\Qt_basic\01_basic_lesson\project01\src\build-qiniu_016-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug\debug\data.txt)");
    // 检查文件是否存在
    if (!dataFile.exists()) {
        // 文件不存在,创建文件
        if (dataFile.open(QIODevice::WriteOnly)) {
            qDebug() << "File created successfully.";

            // 创建一个QTextStream对象out,并将其关联到dataFile文件上
            QTextStream out(&dataFile);

            // 设置实数(浮点数)的输出精度为3位小数
            out.setRealNumberPrecision(3);

            // 设置字段宽度为10个字符,写入的数据将按照10个字符的宽度进行排列
            out.setFieldWidth(10);

            // 设置字段对齐方式为右对齐,写入的数据将在字段宽度内右对齐显示,左侧留有空格填充
            out.setFieldAlignment(QTextStream::AlignRight);

            out<<QString("PI: ")
                <<scientific
                <<left
                <<dPi
                <<hex
                <<Qt::showbase
                <<uppercasebase
                <<age;
            dataFile.close();
        } else {
            qDebug() << "Failed to create file.";
        }
    } else {
        qDebug() << "File already exists.";
    }

3、文件存储并输出
    QFile binfile("info.txt");
    if(binfile.open(QIODevice::WriteOnly|QIODevice::Truncate))
    {
        // 创建一个数据流对象,并将其关联到文件上
        QDataStream out(&binfile);

        // 写入数据到数据流中
        out << QString("易烊千玺")  // 字符串数据
            << QDate::fromString("2000-11-28","yyyy-MM-dd")  // 日期数据
            << (qint32)19;  // 整数数据

        // 关闭文件
        binfile.close();
    }
    else
    {
        // 输出错误信息
        qDebug() << binfile.errorString();
    }

    // 设置文件名为 info.txt
    binfile.setFileName("info.txt");

    // 以只读方式打开文件
    if(binfile.open(QIODevice::ReadOnly))
    {
        // 创建一个数据流对象,并将其关联到文件上
        QDataStream in(&binfile);

        // 定义变量用于存储读取的数据
        QString name;
        QDate birthday;
        qint32 age;

        // 从数据流中读取数据
        in >> name >> birthday >> age;

        // 关闭文件
        binfile.close();

        // 输出读取的数据
        qDebug() << "Name:" << name;
        qDebug() << "Birthday:" << birthday.toString("yyyy-MM-dd");
        qDebug() << "Age:" << age;
    }
    else
    {
        // 输出错误信息
        qDebug() << binfile.errorString();
    }

s输出结果

2、QFileInfo类获取文件信息
// 计算目录大小的递归函数
qint64 Widget::calculateDirSize(const QString &dirPath) {
    qint64 totalSize = 0;

    // 创建 QDir 对象并设置过滤器
    QDir dir(dirPath);
    dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);

    // 获取目录下的文件和子目录信息列表
    QFileInfoList fileInfoList = dir.entryInfoList();

    // 遍历文件和子目录信息列表
    for (const QFileInfo &info : fileInfoList) {
        // 如果是文件,则累加文件大小
        if (info.isFile()) {
            totalSize += info.size();
        }
        // 如果是子目录,则递归调用计算目录大小函数,并累加子目录大小
        else if (info.isDir()) {
            totalSize += calculateDirSize(info.filePath());
        }
    }

    return totalSize;
}

// 获取文件信息并显示在界面上的函数
void Widget::getFileInfo(QString &filename) {
    // 创建 QFileInfo 对象获取文件/目录信息
    QFileInfo info(filename);

    // 根据文件类型获取大小,如果是目录则调用计算目录大小函数
    qint64 size = info.isDir() ? calculateDirSize(filename) : info.size();
    QDateTime createtime = info.created();
    QDateTime lasttime = info.lastModified();
    QDateTime lastrtime = info.lastRead(); // 最后一次访问

    // 获取文件属性信息
    bool isdir = info.isDir();
    bool isfile = info.isFile();
    bool islink = info.isSymLink();
    bool ishidden = info.isHidden();
    bool isread = info.isReadable();
    bool iswrite = info.isWritable();
    bool isexcute = info.isExecutable();

    // 将文件信息显示在界面上
    ui->size->setText(QString::number(size));
    ui->create->setText(createtime.toString());

    ui->dir->setChecked(isdir); // 设置目录选中状态
}

// 浏览按钮点击事件的处理函数
void Widget::on_browsebtn_clicked() {
    // 弹出文件选择对话框选择目录
    QString path = QFileDialog::getExistingDirectory(this, "选择目录", ",");
    ui->name->setText(path); // 在界面上显示选择的目录路径
    getFileInfo(path); // 获取目录信息并显示在界面上
}

效果展示:
在这里插入图片描述