作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。
专栏简介:本文收录于 C++项目——云备份
相关专栏推荐:C语言初阶系列、C语言进阶系列 、C++系列、数据结构与算法、Linux
项目Gitee链接:https://gitee.com/li-yuanjiu/cloud-backup
服务器端的热点文件管理是对上传的非热点文件进行压缩存储,节省磁盘空间
。
而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内
,比如如果一个文件一天都没有被访问过我们就认为这是一个非热点文件,其实就是当前系统时间,与文件最后一次访问时间之间的时间差是否在一天之内的判断。
而我们需要对上传的文件每隔一段时间
进行热点检测
,相当于遍历上传文件的存储文件夹
,找出所有的文件,然后通过对逐个文件进行时间差的判断,来逐个进行热点处理
。
基于这个思想,我们需要将上传的文件存储位置与压缩后压缩文件的存储位置分开
。这样在遍历上传文件夹的时候不至于将压缩过的文件又进行非热点处理了。
总结之后,我们得出几个关键点与步骤:
上传文件有自己的上传存储位置,非热点文件的压缩存储有自己的存储位置
;遍历上传存储位置文件夹,获取所有文件信息
;获取每个文件最后一次访问时间,进而完成是否热点文件的判断
;对非热点文件进行压缩存储,删除原来的未压缩文件,修改备份信息
;热点管理类中,只要包含两个成员函数:
HotJudge
:用于判断文件是否为非热点文件;RunModule
:主要的运行函数,完成上述热点管理的全部步骤。class HotManager
{
public:
HotManager();
bool RunModule(); // 主逻辑函数
private:
bool HotJudge(const std::string &filename); // 判断是否为非热点文件
};
将热点管理类的实现置于hot.hpp
头文件中。
#ifndef __MY_HOT__
#define __MY_HOT__
#include
#include "data.hpp"
extern cloud::DataManager* _data; // 全局数据管理类对象
namespace cloud
{
class HotManager
{
public:
HotManager()
{
Config* config = Config::GetInstance(); // 获取配置文件读取类的单例
FileUtil fu1(config->GetBackDir());
FileUtil fu2(config->GetPackDir());
fu1.CreateDirectory();
fu2.CreateDirectory();
}
bool RunModule()
{
Config* config = Config::GetInstance(); // 获取配置文件读取类的单例
while(1)
{
// 1.遍历备份目录,获取所有文件名
FileUtil fu(config->GetBackDir());
std::vector<std::string> array;
fu.ScanDirectory(&array);
// 2.遍历判断文件是否是非热点文件
for(auto &a : array)
{
if(HotJudge(a) == false)
continue;
// 3.获取文件备份信息
BackupInfo info;
if(_data->GetOneByRealpath(a, &info) == false)
{
// 现在存在一个文件,但是没有备份信息
info.NewBackupInfo(a);
}
// 4.对非热点文件进行压缩处理
FileUtil tmp(a);
tmp.Compress(info.pack_path);
// 5.删除源文件,修改备份信息
tmp.Remove();
info.pack_flag = true;
_data->Updata(info);
}
usleep(1000);
}
return true;
}
private:
bool HotJudge(const std::string &filename)
{
Config* config = Config::GetInstance(); // 获取配置文件读取类的单例
FileUtil fu(filename);
time_t last_atime = fu.LastATime();
time_t cur_time = time(NULL);
if(cur_time - last_atime > config->GetHotTime())
{
return true;
}
return false;
}
};
}
#endif