Qt总结之二:遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(二)

本文详细介绍使用Qt进行文件筛选与遍历的方法,包括在单一目录及设备所有磁盘下查找特定文件,如.txt文件,并展示如何获取文件的详细信息,如路径、名称、大小、创建时间等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言


需要在特定目录或磁盘下查找特定文件

一、筛选目录

(一)单一目录下遍历,筛选特定文件

QDir dir("./SaveFiles");
QFileInfoList list = dir.entryInfoList();

(二)设备所有磁盘中遍历

QFileInfoList DirInfoList = QDir::drives();

    二、遍历目录和文件

在容器List中遍历每个文件信息(QFileInfo fileInfo),文件信息包含:

 

文件路径 :fileInfo.filePath();

文件全名称:fileInfo.fileName();

文件前缀:fileInfo.baseName();

文件后缀:fileInfo.suffix();

文件是否存在:fileInfo.exists();

文件大小:fileInfo.size();

是否是文件:fileInfo.isFile();

是否是目录:fileInfo.isDir();

是否是连接符:fileinfo.isSymLink()

/////////////////////////////////////////////////////////////////////////////////////////
  typedef struct fileNamePath
    {
	   QString strFileName;
	   QString strFilePath;
    }sfileNamePath;
//////////////////////////////////.cpp///////////////////////////////////////////////////
    qint64 beginTime =  ui->beginDateTimeEdit->dateTime().toTime_t();//先将QDateTime时间转UTC时间,在计算秒数
    qint64 endTime=  ui->endDateTimeEdit->dateTime().toTime_t();
    QDir dir("./SavedFiles");
    dir.setFilter(QDir::Files);
    QStringList filters;
    filters<<"*txt"; //遍历筛选特定文件(*.txt)
    dir.setNameFilters(filters);
    QFileInfoList list = dir.entryInfoList();
    QStringList filelist;
    QList<QStringList>searchFileList_list;//创建容器添加文件的名称、创建时间、大小、类型
    foreach(QFileInfo fileinfo,list)
    {
        int index_p = fileinfo.fileName().indexOf(".");
        QString fileName = fileinfo.fileName().left(index_p);//获取文件名前缀
        filelist <<fileinfo.fileName() <<fileinfo.suffix();
        qint64 fileTime = QDateTime::fromString(fileName,"yyyy-MM-dd hh-mm-ss").toTime_t();//QString转QdateTime
        if(fileTime >=beginTime && fileTime <= endTime)
        {
            QStringList fileInforList;
            fileInforList.append(fileName);
            QString createTime = fileinfo.created().toString("yyyy/MM/dd hh:mm:ss");//文件时间
            fileInforList.append(createTime);
            QString kind = fileinfo.suffix();//文件类型
            fileInforList.append(kind);
            int size;
            QString sizeStr;
            size = int((fileinfo.size() + 1023) /1024);//文件大小
            sizeStr = QString::number(size,'g',2) +"KB";
            fileInforList.append(sizeStr);
            searchFileList_list.append(fileInforList);

        }
    }


 

<think>好的,用户的问题是关于如何在Qt中实现对INI配置文件的循环读取,特别是针对组为A1、A2、A3的情况。首先,我需要回顾一下用户之前的对话提供的引用内容,以确保回答的连贯性准确性。 用户之前已经询问过Qt读取INI文件的基本方法,我给出了一个完整的示例,包括读取特定组的键值。现在用户的需求更具体,涉及到循环读取多个组,比如A1、A2、A3。这可能意味着用户希望处理多个结构类似的组,避免重复代码,提高效率。 首先,我需要确认Qt的QSettings类是否支持枚举所有的组或键。根据之前的回答引用,QSettings确实可以处理INI文件的不同节段,但用户可能需要知道如何动态地获取这些组的列表,然后循环处理它们。 接下来,考虑用户提供的引用内容。引用[2]提到QSettings类可以读写INI文件,而引用[3]展示了一个包含多个组的INI文件结构,例如[mountinfo]、[v]、[a]等。这说明用户可能已经了解基本的读写操作,现在需要处理多个相似命的组。 用户的问题中的关键点在于循环读取组为A1、A2、A3的情况。可能的实现步骤包括: 1. **获取所有组**:使用QSettings的childGroups()方法获取所有组的列表。 2. **过滤需要的组**:由于用户可能需要处理特定模式的组(如A1、A2、A3),可能需要通过正则表达式或字符串匹配来筛选出这些组。 3. **循环处理每个组**:遍历筛选后的组,逐个读取每个组中的键值对。 需要注意的是,QSettings在读取组时可能需要处理组的顺序或是否存在的情况。此外,用户可能需要处理每个组中的相同键,或者不同的键结构,这会影响循环内部的实现。 另外,用户可能希望动态生成组,例如根据前缀"A"数字后缀来构造组,如A1到A3。这种情况下,可能需要先生成组的列表,然后循环读取每个组,即使某些组不存在,也需要处理默认值或错误情况。 还需要考虑INI文件的结构,例如每个组中的键是否一致,是否需要读取所有键还是特定键。如果键有规律,也可以进行循环读取,进一步减少重复代码。 最后,需要确保代码示例的正确性,包括使用beginGroup()endGroup()来切换组,正确处理数据类型转换,以及处理可能的异常情况,比如组或键不存在时的默认值设置。 总结来说,回答需要提供以下内容: - 使用childGroups()获取所有组,筛选出A1、A2、A3。 - 或者,根据已知的组模式生成组列表,然后循环读取。 - 在循环内部处理每个组的键值读取。 - 提供代码示例注意事项,如组存在性检查、编码问题等。</think>以下是在Qt中实现循环读取A1、A2、A3等系列组的方法详解: ### 一、实现原理 通过`QSettings`的`childGroups()`方法获取所有组列表,配合正则表达式过滤目标组。假设INI文件结构如下: ```ini [A1] key1=100 key2=200 [A2] key1=300 key2=400 [A3] key1=500 key2=600 ``` ### 、完整实现代码 ```cpp #include <QSettings> #include <QRegularExpression> void readGroupSeries() { QSettings config("config.ini", QSettings::IniFormat); // 方法1:动态检测所有符合A+数字的组 QStringList allGroups = config.childGroups(); QRegularExpression re("^A\\d+$"); // 匹配以A开头+数字结尾的组 // 方法2:手动构造组序列(适用于已知组数量) // QStringList targetGroups = {"A1", "A2", "A3"}; foreach (const QString &group, allGroups) { if (re.match(group).hasMatch()) { // 使用正则过滤 // if (group.startsWith("A")) { // 或使用前缀匹配 config.beginGroup(group); // 读取当前组所有键 QStringList keys = config.childKeys(); foreach (const QString &key, keys) { QVariant value = config.value(key); qDebug() << "组" << group << "| 键" << key << "| 值" << value.toString(); } // 或按固定键读取(推荐) int key1 = config.value("key1", 0).toInt(); int key2 = config.value("key2", 0).toInt(); qDebug() << "组" << group << "=> key1:" << key1 << "key2:" << key2; config.endGroup(); } } } ``` ### 三、关键实现技术 1. **动态组检测**: - 使用`childGroups()`获取所有组列表[^2] - 通过正则表达式`^A\\d+$`筛选以A开头+数字结尾的组(如A1、A2等) 2. **组遍历方式**: ```cpp // 方式1:自动检测所有匹配组(推荐) QStringList allGroups = config.childGroups(); // 方式2:手动指定范围(当组数量已知时) for(int i=1; i<=3; i++){ QString group = QString("A%1").arg(i); if(config.childGroups().contains(group)){ // 处理组内容 } } ``` 3. **多级数据处理**: ```cpp // 读取组内所有键(适用于未知键场景) foreach (QString key, config.childKeys()) { // 处理每个键值对 } // 读取特定键(推荐已知键结构时使用) config.value("key1").toInt(); ``` ### 四、特殊场景处理 1. **缺失组处理**: ```cpp if(config.childGroups().contains("A4")) { // 处理可能存在的扩展组 } ``` 2. **类型安全读取**: ```cpp // 带类型检查默认值 QVariant val = config.value("key3", QVariant::Invalid); if(val.isValid() && val.canConvert<int>()) { int num = val.toInt(); } ``` 3. **嵌套数据支持**: ```ini [A1] coordinates=@Variant(\x00\x00\x00\x0b\x00\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00\x1e) ``` ```cpp QPoint point = config.value("coordinates").toPoint(); ``` ### 五、性能优化建议 1. **批量读取优化**: ```cpp config.beginGroup("A1"); QMap<QString, QVariant> map = config.keyValues(); config.endGroup(); ``` 2. **缓存机制**: ```cpp static QMap<QString, QVariantMap> configCache; if(configCache.isEmpty()){ // 首次加载时缓存所有组数据 } ``` 3. **异步加载**: ```cpp QtConcurrent::run([=](){ // 在后台线程执行配置读取 }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值