qt-文件自动按编号命名

这里是目录标题

场景介绍

每次软件运行时,会创建一个文件,文件名是一致的,为了保证文件不重叠覆盖,每次新建的文件在文件名后面添加1,2,3......编号加以区分

在Qt C++中实现文件递增编号创建,可通过以下步骤完成,核心逻辑是扫描目录中已存在的文件,解析最大编号后+1生成新文件名:

cpp 复制代码
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QRegularExpression>
#include <QDebug>

QString generateIncrementalFilename(const QString &baseName, const QString &ext, const QString &dirPath) {
    QDir dir(dirPath);
    if (!dir.exists())
        dir.mkpath(dirPath); // 确保目录存在

    // 正则匹配模式:基础名_数字.扩展名(如:data_file_1.txt)
    QRegularExpression regex(QString("%1_(\\d+)%2").arg(baseName, ext));
    QStringList filters;
    filters << QString("%1_*%2").arg(baseName, ext); // 过滤目标文件

    int maxNum = 0;
    foreach (const QString &file, dir.entryList(filters, QDir::Files)) {
        QRegularExpressionMatch match = regex.match(file);
        if (match.hasMatch()) {
            bool ok;
            int num = match.captured(1).toInt(&ok);
            if (ok && num > maxNum)
                maxNum = num;
        }
    }

    int newNum = maxNum + 1;
    return QString("%1/%2_%3%4").arg(dirPath).arg(baseName).arg(newNum).arg(ext);
}

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

    // 配置参数
    QString baseName = "data_file";
    QString extension = ".txt";
    QString dirPath = QCoreApplication::applicationDirPath(); // 默认程序所在目录

    // 生成新文件名
    QString newFilename = generateIncrementalFilename(baseName, extension, dirPath);
    qDebug() << "New file path:" << newFilename;

    // 创建并写入文件
    QFile file(newFilename);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        file.write("This is auto-generated incremental file.\n");
        file.close();
        qDebug() << "File created successfully!";
    } else {
        qDebug() << "Failed to create file!";
    }

    return a.exec();
}

关键逻辑解析

  • 文件名模式匹配:
    • 使用正则表达式baseName_(\d+)ext匹配已有文件(如data_file_1.txt)
    • 通过entryList过滤目录中所有符合基础模式的文件
  • 编号递增逻辑:
    • 遍历匹配文件,提取数字部分并找到最大值
    • 新编号 = 最大值 + 1(无文件时从1开始)
  • 目录处理:
    • 自动创建目标目录(通过mkpath)
    • 默认使用程序所在目录,可修改dirPath变量指定路径
  • 文件创建:
    • 使用QFile创建文件并写入内容
    • 处理文件打开失败的情况(权限不足/路径无效等)

自定义配置点

  • 修改基础文件名:调整baseName变量(如改为log_)
  • 修改扩展名:调整extension变量(如.log)
  • 修改存储路径:设置dirPath为其他目录(如QStandardPaths::writableLocation(QStandardPaths::AppDataLocation))
    边界情况处理
  • 目录不存在:自动创建目录
  • 无匹配文件:从1开始编号
  • 文件被占用:文件打开失败时返回错误信息
  • 编号溢出:int类型在常规场景足够(最大2147483647)

扩展优化建议

  • 前导零格式化(如001):
cpp 复制代码
QString newNum = QString("%1").arg(newNum, 3, 10, QChar('0')); // 3位前导零
  • 日期时间戳前缀:
cpp 复制代码
QString timestamp = QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss");
newFilename = QString("%1/%2_%3_%4%5").arg(dirPath, baseName, timestamp, newNum, ext);
  • 并发安全:多线程环境下需加锁或使用QFile::exists()二次验证
    此方案确保每次运行程序时,新文件在基础名称后追加递增数字,避免覆盖旧文件,且兼容不同扩展名和自定义存储路径。
相关推荐
aini_lovee3 分钟前
基于MATLAB的材料晶粒组织生长与变化模拟:方法、实现与应用
开发语言·算法·matlab
1104.北光c°4 分钟前
【黑马点评项目笔记 | 优惠券秒杀篇】构建高并发秒杀系统
java·开发语言·数据库·redis·笔记·spring·nosql
梦梦代码精5 分钟前
Gitee 年度人工智能竞赛开源项目评选揭晓!!!
开发语言·数据库·人工智能·架构·gitee·前端框架·开源
2501_907136827 分钟前
PDF增效工具 Quite imposing plus6
java·开发语言
常利兵11 分钟前
Android Gradle 构建脚本现代化:Kotlin DSL (.kts) 与 Groovy DSL 深度对比与实战指南
android·开发语言·kotlin
csbysj202014 分钟前
Ruby CGI 编程
开发语言
jiang_changsheng16 分钟前
MCP协议的核心架构基础
c语言·开发语言·c++·python·comfyui
杨超越luckly20 分钟前
从传统 GIS 向智能/自动化脚本演进:地铁接驳公交识别的 ArcGIS 与 Python 双路径实践
开发语言·arcgis·php·交互·数据可视化
qw94922 分钟前
Python语言概述
开发语言·python
毕设源码-邱学长24 分钟前
【开题答辩全过程】以 基于Python的茶叶销售数据可视化分析系统设计实现为例,包含答辩的问题和答案
开发语言·python·信息可视化