读取这个文件夹的全部子文件夹,按照时间顺序排序,生成文件夹名称列表

以下是使用Qt C++实现的解决方案,用于读取指定目录下按日期命名的子文件夹并按时间顺序排序:

#include <QCoreApplication>
#include <QDir>
#include <QDate>
#include <QDebug>
#include <QPair>
#include <algorithm>

// 自定义比较函数,按日期升序排序
bool compareByDate(const QPair<QDate, QString>& a, const QPair<QDate, QString>& b) {
    return a.first < b.first;
}

QStringList getSortedFolderList(const QString& parentDirPath) {
    QDir parentDir(parentDirPath);
    QStringList dateFormat = {"yyyyMMdd"};  // 日期格式(根据实际情况调整)
    
    // 获取所有子目录(不包含"."和"..")
    QStringList subDirs = parentDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
    
    QList<QPair<QDate, QString>> dateFolderPairs;

    for (const QString& subDir : subDirs) {
        // 提取日期部分(假设日期在目录名开头,长度至少8位)
        QString dateStr = subDir.left(8);
        if (dateStr.length() < 8) continue;

        // 尝试解析日期
        QDate date = QDate::fromString(dateStr, dateFormat.first());
        if (!date.isValid()) {
            qWarning() << "Invalid date format in folder:" << subDir;
            continue;
        }

        dateFolderPairs.append(qMakePair(date, subDir));
    }

    // 按日期排序
    std::sort(dateFolderPairs.begin(), dateFolderPairs.end(), compareByDate);

    // 提取排序后的文件夹名称
    QStringList sortedFolders;
    for (const auto& pair : dateFolderPairs) {
        sortedFolders.append(pair.second);
    }

    return sortedFolders;
}

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

    QString targetPath = "/path/to/your/folder";  // 替换为你的目录路径
    QStringList sortedFolders = getSortedFolderList(targetPath);

    // 打印结果
    qDebug() << "Sorted folders:";
    for (const QString& folder : sortedFolders) {
        qDebug() << folder;
    }

    return 0;
}

使用说明:

  1. 修改日期格式
    • 如果文件夹名称中的日期格式不同(如YYYY-MM-DD),修改dateFormat数组:
      QStringList dateFormat = {"yyyy-MM-dd"}; // 示例:2023-01-01
    • 支持多种格式尝试解析:
      QStringList dateFormat = {"yyyyMMdd", "yyyy-MM-dd", "yyyy_MM_dd"};
  2. 处理路径
    • 替换targetPath为实际目录路径(绝对路径或相对路径)。
  3. 编译运行
    • 将代码保存为main.cpp,使用Qt Creator或命令行编译:

      qmake -project
      qmake
      make
      ./your_project_name

功能说明:

  1. 遍历子目录
    • 使用QDir::entryList()获取所有子目录(排除...)。
  2. 日期解析
    • 提取目录名前8位作为日期字符串。
    • 使用QDate::fromString()解析日期,支持自定义格式。
  3. 排序逻辑
    • QPair<QDate, QString>存入列表,按日期升序排序。
  4. 错误处理
    • 跳过无法解析为有效日期的文件夹,并输出警告。

扩展功能建议:

  • 降序排序:修改比较函数为return a.first > b.first;
  • 包含子目录:使用QDirIterator递归遍历多层目录。
  • 输出到文件

    QFile file("sorted_folders.txt");
    if (file.open(QIODevice::WriteOnly)) {
        QTextStream stream(&file);
        stream << sortedFolders.join("\n");
        file.close();
    }

示例输出:

假设目录包含:

20230101_project/
20221225_backup/
invalid_folder/
20230215_logs/

运行结果:

Sorted folders:
"20221225_backup"
"20230101_project"
"20230215_logs"
Invalid date format in folder: "invalid_folder"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值