以下是使用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;
}
使用说明:
- 修改日期格式:
- 如果文件夹名称中的日期格式不同(如
YYYY-MM-DD),修改dateFormat数组:QStringList dateFormat = {"yyyy-MM-dd"}; // 示例:2023-01-01 - 支持多种格式尝试解析:
QStringList dateFormat = {"yyyyMMdd", "yyyy-MM-dd", "yyyy_MM_dd"};
- 如果文件夹名称中的日期格式不同(如
- 处理路径:
- 替换
targetPath为实际目录路径(绝对路径或相对路径)。
- 替换
- 编译运行:
- 将代码保存为
main.cpp,使用Qt Creator或命令行编译:qmake -project qmake make ./your_project_name
- 将代码保存为
功能说明:
- 遍历子目录:
- 使用
QDir::entryList()获取所有子目录(排除.和..)。
- 使用
- 日期解析:
- 提取目录名前8位作为日期字符串。
- 使用
QDate::fromString()解析日期,支持自定义格式。
- 排序逻辑:
- 将
QPair<QDate, QString>存入列表,按日期升序排序。
- 将
- 错误处理:
- 跳过无法解析为有效日期的文件夹,并输出警告。
扩展功能建议:
- 降序排序:修改比较函数为
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"
7071

被折叠的 条评论
为什么被折叠?



