187 lines
5.3 KiB
C++
187 lines
5.3 KiB
C++
|
|
#include "DeleteExpiredFolderEngine.h"
|
|||
|
|
|
|||
|
|
using namespace ai_matrix;
|
|||
|
|
|
|||
|
|
DeleteExpiredFolderEngine::DeleteExpiredFolderEngine() {}
|
|||
|
|
|
|||
|
|
DeleteExpiredFolderEngine::~DeleteExpiredFolderEngine() {}
|
|||
|
|
|
|||
|
|
APP_ERROR DeleteExpiredFolderEngine::Init()
|
|||
|
|
{
|
|||
|
|
iDaysNumber_ = MyYaml::GetIns()->GetIntValue("gc_days_for_result_expire_folder");
|
|||
|
|
strResultPath_ = MyYaml::GetIns()->GetPathValue("gc_result_path");
|
|||
|
|
|
|||
|
|
LogInfo << "DeleteExpiredFolderEngine Init ok";
|
|||
|
|
return APP_ERR_OK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
APP_ERROR DeleteExpiredFolderEngine::DeInit()
|
|||
|
|
{
|
|||
|
|
LogInfo << "DeleteExpiredFolderEngine DeInit ok";
|
|||
|
|
return APP_ERR_OK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
APP_ERROR DeleteExpiredFolderEngine::Process()
|
|||
|
|
{
|
|||
|
|
int iRet = APP_ERR_OK;
|
|||
|
|
while (!isStop_)
|
|||
|
|
{
|
|||
|
|
std::string strTrainDate_temp = MyUtils::getins()->GetDate();
|
|||
|
|
|
|||
|
|
DeletePreviousFolder(strResultPath_, strTrainDate_temp, iDaysNumber_);
|
|||
|
|
|
|||
|
|
usleep(1000*1000*3600*24); //每二十四小时执行一次
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return APP_ERR_OK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DeleteExpiredFolderEngine::DeletePreviousFolder(std::string path, const std::string &date, int n_days)
|
|||
|
|
{
|
|||
|
|
// 1 computer date
|
|||
|
|
std::string previous_date = getDateBeforeNDays(date, n_days);
|
|||
|
|
if (!previous_date.empty())
|
|||
|
|
std::cout << "Date before " << n_days << " days from " << date << " is: " << previous_date << std::endl;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 2
|
|||
|
|
std::vector<Date> subfolders;
|
|||
|
|
GetSubfolderNames(path, subfolders);
|
|||
|
|
// for (const auto &it : subfolders)
|
|||
|
|
// std::cout << it.year << "." << it.month << "." << it.day << std::endl;
|
|||
|
|
|
|||
|
|
// 3 delete
|
|||
|
|
if (path.back() != '/')
|
|||
|
|
path += "/";
|
|||
|
|
Date reference_date = StrToDate(previous_date); // 给定的参考日期
|
|||
|
|
DeleteEarlierDatesFolder(path, subfolders, reference_date);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取某月有多少天
|
|||
|
|
int DeleteExpiredFolderEngine::DaysInMonth(int year, int month)
|
|||
|
|
{
|
|||
|
|
int max_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
|||
|
|
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
|
|||
|
|
{
|
|||
|
|
max_days[2] = 29; // 闰年2月有29天
|
|||
|
|
}
|
|||
|
|
return max_days[month];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 解析字符串为日期结构体
|
|||
|
|
Date DeleteExpiredFolderEngine::StrToDate(const std::string &date_str)
|
|||
|
|
{
|
|||
|
|
std::istringstream iss(date_str);
|
|||
|
|
int year, month, day;
|
|||
|
|
char dash;
|
|||
|
|
|
|||
|
|
if (!(iss >> year >> dash && dash == '-' &&
|
|||
|
|
iss >> month >> dash && dash == '-' &&
|
|||
|
|
iss >> day))
|
|||
|
|
{
|
|||
|
|
LogError << ("Invalid date format") << ":" << date_str;
|
|||
|
|
}
|
|||
|
|
return {year, month, day};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 减去指定天数
|
|||
|
|
void DeleteExpiredFolderEngine::SubtractDays(Date &date, int n_days)
|
|||
|
|
{
|
|||
|
|
while (n_days > 0)
|
|||
|
|
{
|
|||
|
|
date.day--;
|
|||
|
|
n_days--;
|
|||
|
|
if (date.day == 0)
|
|||
|
|
{
|
|||
|
|
if (--date.month == 0)
|
|||
|
|
{
|
|||
|
|
--date.year;
|
|||
|
|
date.month = 12;
|
|||
|
|
}
|
|||
|
|
int max_days = DaysInMonth(date.year, date.month);
|
|||
|
|
date.day = max_days;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 格式化日期结构体为字符串
|
|||
|
|
std::string DeleteExpiredFolderEngine::DateToStr(const Date &date)
|
|||
|
|
{
|
|||
|
|
std::ostringstream oss;
|
|||
|
|
oss << date.year << "-" << std::setfill('0') << std::setw(2) << date.month << "-" << std::setw(2) << date.day;
|
|||
|
|
return oss.str();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 主要功能函数,接收一个日期字符串和一个整数n,返回n天前的日期字符串
|
|||
|
|
std::string DeleteExpiredFolderEngine::getDateBeforeNDays(const std::string &input_date, int n_days)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Date date = StrToDate(input_date);
|
|||
|
|
SubtractDays(date, n_days);
|
|||
|
|
return DateToStr(date);
|
|||
|
|
}
|
|||
|
|
catch (const std::exception &e)
|
|||
|
|
{
|
|||
|
|
LogError << "Error: " << e.what();
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DeleteExpiredFolderEngine::GetSubfolderNames(std::string &directory, std::vector<Date> &folder_names)
|
|||
|
|
{
|
|||
|
|
if (directory.back() != '/')
|
|||
|
|
directory += "/";
|
|||
|
|
DIR *dir;
|
|||
|
|
struct dirent *ent;
|
|||
|
|
if ((dir = opendir(directory.c_str())) != nullptr)
|
|||
|
|
{
|
|||
|
|
while ((ent = readdir(dir)) != nullptr)
|
|||
|
|
{
|
|||
|
|
// 排除"."和".."
|
|||
|
|
if (ent->d_type == DT_DIR && ent->d_name[0] != '.' && ent->d_name == "best")
|
|||
|
|
{
|
|||
|
|
folder_names.push_back(StrToDate(ent->d_name));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closedir(dir);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
LogError << "Unable to open directory: " << directory;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DeleteExpiredFolderEngine::DeleteFolder(const std::string directory)
|
|||
|
|
{
|
|||
|
|
std::string command = "rm -rf " + directory;
|
|||
|
|
int result = system(command.c_str());
|
|||
|
|
|
|||
|
|
if (result != 0)
|
|||
|
|
std::cout << "Failed to remove directory recursively: " << directory << std::endl;
|
|||
|
|
else
|
|||
|
|
std::cout << "delete folder successfully : " << directory << std::endl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除向量中小于指定日期的所有元素
|
|||
|
|
void DeleteExpiredFolderEngine::DeleteEarlierDatesFolder(std::string &path, std::vector<Date> &subfolders, const Date &reference_date)
|
|||
|
|
{
|
|||
|
|
if (path.back() != '/')
|
|||
|
|
path += "/";
|
|||
|
|
for (const Date &cur : subfolders)
|
|||
|
|
{
|
|||
|
|
// bool flag = false;
|
|||
|
|
if (cur.year < reference_date.year)
|
|||
|
|
{
|
|||
|
|
DeleteFolder(path + DateToStr(cur));
|
|||
|
|
}
|
|||
|
|
else if (cur.year == reference_date.year && cur.month < reference_date.month)
|
|||
|
|
{
|
|||
|
|
DeleteFolder(path + DateToStr(cur));
|
|||
|
|
}
|
|||
|
|
else if (cur.year == reference_date.year && cur.month == reference_date.month && cur.day < reference_date.day)
|
|||
|
|
{
|
|||
|
|
DeleteFolder(path + DateToStr(cur));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|