文件名的后8位是日期,前几位是代号,如何按照代号和时间对文件进行分类
时间: 2024-10-11 08:16:56 浏览: 16
如果你的文件名称已经按照固定模式形成,比如“代号_YYYYMMDD_其他信息”,其中后8位表示日期,前面是代号,那么可以使用字符串分割和比较的方式来对文件进行分类。这里有一个基本的例子:
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <algorithm>
// 假设文件名格式如:"code_20230517_description.txt"
struct FileInfo {
std::string code;
int year, month, day;
};
bool compareFiles(const FileInfo &a, const FileInfo &b) {
return a.year == b.year && a.month == b.month && a.day < b.day; // 或者根据需要调整排序顺序
}
void categorizeFiles(std::vector<std::string>& filenames) {
std::vector<FileInfo> fileInfos;
for (const auto& filename : filenames) {
std::regex pattern("^(\\w+)_([0-9]{4})([0-9]{2})([0-9]{2})_(.*)$");
std::smatch match;
if (std::regex_search(filename, match, pattern)) {
FileInfo fileInfo;
fileInfo.code = match[1];
fileInfo.year = std::stoi(match[2]);
fileInfo.month = std::stoi(match[3]);
fileInfo.day = std::stoi(match[4]);
fileInfos.push_back(fileInfo);
}
}
// 对文件信息按照代号和日期排序
std::sort(fileInfos.begin(), fileInfos.end(), compareFiles);
// 根据排序后的信息,将文件移动到对应的分类目录
for (auto& fileInfo : fileInfos) {
std::string destDir = "Code/" + fileInfo.code + "/YYYY/MM";
std::string destFileName = fileInfo.code + "_" + std::to_string(fileInfo.year) + std::to_string(fileInfo.month).pad Beginning(2) + "_" + std::to_string(fileInfo.day).pad Beginning(2) + "_" + match.suffix();
moveFileToDirectory(filenames.at(fileInfos.index_of(fileInfo)), destDir, destFileName);
}
}
// 示例函数,将文件从原路径移动到新路径
void moveFileToDirectory(const std::string& source, const std::string& destDir, const std::string& destName) {
// 实现具体的文件移动操作,例如使用filesystem库
}
int main() {
std::vector<std::string> filenames = { /* 文件列表 */ };
categorizeFiles(filenames);
return 0;
}
这个示例中,我们先解析出文件的代号、年月日等信息,并存入FileInfo
结构体中,然后根据这些信息对文件进行排序,最后移动文件到对应的分类目录。