热点管理指的是,按时遍历备份文件目录,然后对每个文件进行热点判断,对于非热点文件进行压缩处理,起到一个节省空间的作用
因此我们热点管理类的接口设计如下:
#ifndef _MY_HOT_
#define _MY_HOT_
#include <unistd.h>
#include "util.hpp"
#include "data_manager.hpp"
extern mjw_cloud::DataManager* _data;//设置一个全局变量,方便使用
namespace mjw_cloud
{
class HotManager
{
public:
HotManager();
bool HotCompress(); // 热点文件压缩功能实现
private:
bool JudgeHot(const std::string &filename); // 热点文件判断
private:
std::string _back_dir; // 备份文件目录
std::string _pack_dir; // 压缩文件目录
std::string _pack_suffix; // 压缩文件后缀
int _hot_time; // 热点时间
};
}
#endif
代码实现如下
#ifndef _MY_HOT_
#define _MY_HOT_
#include <unistd.h>
#include "util.hpp"
#include "data_manager.hpp"
extern mjw_cloud::DataManager *_data; // 设置一个外部全局变量,方便使用
namespace mjw_cloud
{
class HotManager
{
public:
HotManager()
{
_pack_dir = Config::GetInstance().GetPackDir();
_back_dir = Config::GetInstance().GetBackDir();
_pack_suffix = Config::GetInstance().GetLzPrefix();
_hot_time = Config::GetInstance().GetHotTime();
// 注意,这里如果_pack_dir或者_back_dir目录没有创建,我们还需要创建一下
FileUtil fu1(_pack_dir);
fu1.CreateDirectory();
FileUtil fu2(_back_dir);
fu2.CreateDirectory();
}
bool HotCompress() // 热点文件压缩功能实现
{
while (1)
{
// 1.获取备份文件目录下的所有文件
std::vector<std::string> arry;
FileUtil tmp(_back_dir);
tmp.ScanDirectory(&arry);
if (arry.empty())
{
usleep(1000);
continue;
}
// 2.遍历文件判断是否是非热点文件
for (auto a : arry)
{
if (JudgeHot(a) == false) continue;
// 3.对于非热点文件进行压缩处理
FileUtil fu(a);
std::string packname=_pack_dir+fu.FileName()+_pack_suffix;
if(fu.Compress(packname)==false)
{
std::cout<<"hot file compress failed"<<std::endl;
continue;
}
// 4.删除源文件,并且修改该文件信息管理的状态
fu.Remove();
BackupInfo bi;
_data->GetoneByRp(a,&bi);
bi._pack_flag=1;
_data->Updata(bi);
}
usleep(1000);
}
}
private:
bool JudgeHot(const std::string &filename) // 热点文件判断
{
FileUtil fu(filename);
time_t ctime=time(nullptr);
if(ctime-fu.LastATime()>_hot_time)
{
return true;
}
return false;
}
private:
std::string _back_dir; // 备份文件目录
std::string _pack_dir; // 压缩文件目录
std::string _pack_suffix; // 压缩文件后缀
int _hot_time; // 热点时间
};
}
#endif