文章目录
- 整体思路概括
- 热点管理实现
- 构造函数
- Hotjudge ——热点判断
- RunModule ——运行模块
- 代码实现
- hot.hpp
整体思路概括
整体概括:
对服务器上备份的文件进行检测,那些文件长时间没有被访问,则认为是非热点文件 进行压缩存储,节省磁盘空间
实现思路:
遍历所有的文件,检测文件的最后一次访问时间,与当前时间进行相减得到差值
若差值大于设定好的非热点判断时间,则认为是非热点文件 进行压缩 存放到压缩路径中 删除源文件
遍历所有的文件:
1. 从数据管理模块中遍历所有的备份文件信息
2. 遍历备份文件夹 获取所有的文件 进行属性获取 最终判断
遍历文件夹 每次获取文件的最新数据进行判断 还可以解决数据信息缺漏的问题
流程:
1. 遍历备份目录 获取所有文件路径名称
2. 逐个文件获取最后一次访问时间与当前系统时间进行比较判断
3. 对非热点文件进行压缩处理 删除源文件
4. 修改数据管理模块 对应的文件信息(压缩标志-> true 表示这个文件以及被压缩处理了)
热点管理实现
_back_dir 备份文件路径
_pack_dir 压缩文件路径
_pack_suffix 压缩包后缀名
_hot_time 热点时间
在hot.hpp中 使用 extern 修饰 在cloud命名空间中的DataManger类中的 全局变量 _data 就可以在其他.c 或者.cpp中使用
构造函数
通过Config类中的 GetInstance 函数 创建一个对象
再调用 Config类中的 GetBackDir 函数 获取 备份文件路径
调用 GetPackDir函数 获取 压缩文件路径
调用 GetPackFileSuffix 函数 获取 压缩包后缀名
调用 GetHotTime 函数 获取 热点时间
Hotjudge ——热点判断
非热点文件返回true 热点文件返回false
通过filename实例化一个对象fu
再调用FileUtil类中的LastATime函数 获取 文件的最后一次访问时间
将 当前系统时间 cur_time 与 文件最后一次访问时间 last_atime 做差值比较
若大于_hot_time 则认为 是非热点文件 返回 true
若小于_hot_time 则认为是热点文件 返回 false
RunModule ——运行模块
通过_back_dir 备份文件路径 实例化一个对象 fu
创建一个string类型的 数组 arry
调用 FileUtil类中的 ScanDirectory 函数 浏览所有文件数据 并将其数据分别插入到arry数组中
使用范围for进行遍历 而变量a作为路径文件名
若为热点文件则直接跳过
通过cloud命名空间中的 BackupInfo类 实例化一个对象 bi
调用 cloud命名空间中的DataManger类的 GetOneByRealPath函数 获取 路径文件 a中的备份信息
若获取备份信息失败,则 调用 cloud命名空间中的 BackupInfo类的 NewBackupInfo函数
设置一个新的备份信息出来
通过 文件名称a 实例化一个 FileUtil类的对象
再通过FileUtil类的 compress 函数 进行压缩
调用 FileUtil类的 Remove 函数 删除文件
将BackupInfo类中的 pack_flag 变量 压缩标志设为true 表示压缩成功
bi中包含文件备份信息
所以调用 BackupInfo类中的 update 函数 将bi更新到 _table哈希表中
代码实现
hot.hpp
#ifndef _MY_HOT_
#define _MY_HOT_
#include<unistd.h>
#include"data.hpp"
extern cloud::DataManger *_data;
namespace cloud
{
class HotManger
{
private:
std::string _back_dir;// 备份文件路径
std::string _pack_dir;// 压缩文件路径
std::string _pack_suffix;//压缩包后缀名
int _hot_time; // 热点时间
private:
bool Hotjudge(const std::string &filename)//热点判断
{
FileUtil fu(filename);
time_t last_atime=fu.LastATime();//文件最后一次访问时间
time_t cur_time=time(NULL);//当前系统时间
if(cur_time-last_atime>_hot_time)
{
//差值超过设定的值 所以为非热点文件
return true;
}
//差值小于设定的值 所以为热点文件
return false;
}
public:
HotManger() //构造函数
{
Config* config=Config::GetInstance();//创建对象
_back_dir=config->GetBackDir();
_pack_dir=config->GetPackDir();
_pack_suffix=config->GetPackFileSuffix();
_hot_time=config->GetHotTime();
FileUtil tmp1(_back_dir);
FileUtil tmp2(_pack_dir);
//为了防止目录不存在 则创建目录
tmp1.CreateDirectory();//创建目录
tmp2.CreateDirectory();
}
bool RunModule()//运行模块
{
while(1)
{
//遍历备份目录 获取所有文件名
FileUtil fu(_back_dir);
std::vector<std::string>arry;
fu.ScanDirectory(&arry);
//遍历判断文件是否是非热点文件
for(auto &a :arry)
{
if(Hotjudge(a)==false)//说明为热点文件
{
//热点文件不需要处理 所以直接跳过
continue;
}
//获取文件备份信息
cloud::BackupInfo bi;
//GetOneByRealPat 通过realpath获取单个数据
if(_data->GetOneByRealPath(a,&bi)==false)
{
//有文件存在 但是没有备份信息
bi.NewBackupInfo(a);
}
//对非热点文件进行压缩处理
FileUtil tmp(a);
tmp.compress(bi.pack_path);//压缩
//删除源文件 修改备份信息
tmp.Remove();
bi.pack_flag=true;//表示压缩成功
_data->update(bi);//将bi更新到_table哈希表中
}
usleep(1000);
}
return true;
}
};
}
#endif