马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
1.热门管理文件的根本思绪
2.热门管理类的计划
3.热门管理类的实现
1.热门管理文件的根本思绪
服务器端的热门文件管理是对上传的非热门文件举行压缩存储,节流磁盘空间。
而热门文件的判定在于上传的文件的末了一次访问时间是否在热门判定时间之内。
实现思绪也就是遍历全部文件,检测文件末了一次访问时间,与当前时间举行相减得到差值,这个差值如果大于我们设置好的非热门判定时间,则可以认为好坏热门文件,此时必要举行压缩存放到压缩路径中,删除源文件
毕竟上,我们这里有两种选择:
- 从数据管理模块中遍历全部备份文件信息
- 遍历备份文件夹,获取全部文件的属性,然后举行判定。
我们选择第2种,每一次都是获取文件的最新数据然后举行判定,而且还可以办理数据信息罅漏的问题,
我们必要对上传的文件每隔一段时间举行热门检测,相称于遍历上传文件的存储文件夹,找出全部的文件,然后通过对逐个文件举行时间差的判定,来逐个举行热门处理惩罚。
基于这个头脑,我们必要将上传的文件存储位置与压缩后压缩文件的存储位置分开。
如许在遍历上传文件夹的时间不至于将压缩过的文件又举行非热门处理惩罚了。
总结之后,我们得出几个关键点与步调:
- 上传文件有自己的上传存储位置,非热门文件的压缩存储有自己的存储位置;
- 遍历备份目次,获取全部文件路径名称;
- 逐个获取每个文件末了一次访问时间,进而完成是否热门文件的判定;
- 对非热门文件举行压缩存储,删除原来的未压缩文件,修改数据管理模块对应的信息——压缩标记位设置为true;
2.热门管理类的计划
热门管理类中,只要包罗两个成员函数:
- HotJudge:用于判定文件是否为非热门文件;
- RunModule:重要的运行函数,完成上述热门管理的全部步调。
- class HotManager
- {
- public:
- HotManager();
- bool RunModule(); // 主逻辑函数
- private:
- bool HotJudge(const std::string &filename); // 判断是否为非热点文件
- };
复制代码 3.热门管理类的实现
hot.hpp
- #ifndef __MY_HOT__
- #define __MY_HOT__
- #include <unistd.h>
- #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)//a就是每个文件的路径名称
- {
- 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);//避免空目录循环遍历,消耗CPU功率过高
- }
- return true;
- }
- private:
- bool HotJudge(const std::string &filename)
- {
- Config* config = Config::GetInstance(); // 获取配置文件读取类的单例,获取hottime
- FileUtil fu(filename);//获取当前文件的LastAcctime
- time_t last_atime = fu.LastAcctime();
- time_t cur_time = time(NULL);
- if(cur_time - last_atime > config->GetHotTime())//判断非热点文件的核心
- {
- return true;//是非热点文件
- }
- return false;//是热点文件
- }
- };
- }
- #endif
复制代码 cloud.cc
- #include "util.hpp"
- #include "conf.hpp"
- #include "data.hpp"
- #include"hot.hpp"
- cloud::DataManager * _data;
- void HotTest()
- {
- _data=new cloud::DataManager();
- cloud::HotManager hot;
- hot.RunModule();
- }
- int main(int argc, char *argv[])
- {
- HotTest();
- return 0;
- }
复制代码
这个时间我们换别的一个呆板来看
我们发现创建好了backdir和packdir
我们把bundle.h拷贝到这个backdir内里去,静静等候30秒(我们设置文件内里设置的非热门判定时间)
也是乐成了。很好了
我们去cloud.dat内里看到压缩记录了。
我们git一下
|