c++创建每日文件夹,放入每日日志

编译使用g++ demo.cpp -std=c++17 确保使用 C++17 及以上版本进行编译 推荐 9.0 以上版本

首先创建logs总文件夹,例如/home/xs/logs

然后创建当前日期的文件夹,例如/home/xs/logs/2024.12.10

随后把文件放入此日期文件夹中,例如/home/xs/logs/2024.12.10/3d.pcd

最后遍历logs下的所有文件夹,判断文件夹日期和当前系统日期差距是多少天,超过设置时间的文件夹会以递归的形式将内容和文件夹全部删除

cpp 复制代码
#include <iostream>
#include <filesystem>
#include <chrono>
#include <fstream>

namespace fs = std::filesystem;

// 定义 days 类型以兼容 C++17
using days = std::chrono::duration<int, std::ratio<86400>>;

// 判断文件夹是否超过一个月
bool isOlderThanOneMonth(const fs::directory_entry &dirEntry) {
    // 获取文件的最后写入时间(文件时钟)
    auto fileTime = dirEntry.last_write_time();

    // 转换为 system_clock 时间点
    auto fileTimeAsSystemClock = std::chrono::time_point_cast<std::chrono::system_clock::duration>(
            fileTime - fs::file_time_type::clock::now() + std::chrono::system_clock::now()
    );

    // 获取当前时间
    auto now = std::chrono::system_clock::now();

    // 计算时间差并判断是否超过 30 天
    auto age = std::chrono::duration_cast<days>(now - fileTimeAsSystemClock).count();
    return age > 30;
}

// 创建以今日日期命名的文件夹
std::string createTodayFolder(const std::string &baseDir) {
    auto t = std::time(nullptr);
    auto tm = *std::localtime(&t);
    char folderName[100];
    std::strftime(folderName, sizeof(folderName), "%Y-%m-%d", &tm);
    std::string todayFolder = baseDir + "/" + folderName;

    if (!fs::exists(todayFolder)) {
        fs::create_directory(todayFolder);
        std::cout << "Created folder: " << todayFolder << std::endl;
    } else {
        std::cout << "Folder already exists: " << todayFolder << std::endl;
    }
    return todayFolder;
}

// 删除超过一个月的文件夹
void cleanupOldFolders(const std::string &baseDir) {
    for (const auto &entry: fs::directory_iterator(baseDir)) {
        if (fs::is_directory(entry) && isOlderThanOneMonth(entry)) {
            fs::remove_all(entry);
            std::cout << "Deleted old folder: " << entry.path() << std::endl;
        }
    }
}

int main() {
    std::string baseDir = "logs";//文件目录
    // 创建主目录
    if (!fs::exists(baseDir)) {
        fs::create_directory(baseDir);
    }
    // 创建今日文件夹
    std::string todayFolder = createTodayFolder(baseDir);
    // 复制文件到今日文件夹
    std::string sourceFilePath = "/home/xs/BOX_1.pcd";  //要移动到文件夹里面的而文件
    std::string destinationFilePath = todayFolder + "/2d.pcd"; //移动到logs/todayFolder里面,命名为2d.pcd

    try {
        fs::copy(sourceFilePath, destinationFilePath, fs::copy_options::overwrite_existing);
        std::cout << "Copied file to: " << destinationFilePath << std::endl;
    } catch (const fs::filesystem_error &e) {
        std::cerr << "Error copying file: " << e.what() << std::endl;
    }

    // 清理一个月前的文件夹
    cleanupOldFolders(baseDir);

    return 0;
}
相关推荐
LIN-JUN-WEI13 分钟前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
望获linux1 小时前
【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed
linux·运维·服务器·开发语言·前端·操作系统·嵌入式软件
眠りたいです1 小时前
Mysql常用内置函数,复合查询及内外连接
linux·数据库·c++·mysql
笑鸿的学习笔记1 小时前
qt-C++语法笔记之Stretch与Spacer的关系分析
c++·笔记·qt
留不住丨晚霞2 小时前
说说SpringBoot常用的注解?
java·开发语言
hardStudy_h2 小时前
C++——内联函数与Lambda表达式
开发语言·jvm·c++
艾莉丝努力练剑2 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
ZZZS05162 小时前
stack栈练习
c++·笔记·学习·算法·动态规划
位东风3 小时前
【c++学习记录】状态模式,实现一个登陆功能
c++·学习·状态模式
witton4 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合