⚡文件信息管理模块⚡
admin
2024-04-20 23:43:45
0

目录

🌳.文件信息管理模块介绍

🌳.FileInfo类的设计

🌳. FileInfoManger类的设计(文件信息管理类)

 🍎.FileInfoManger类的成员变量

🍎.成员函数


🌳.文件信息管理模块介绍

  1. 在云备份服务器上,每一个文件都有一个FileInfo的类对象管理该文件的信息,包括文件压缩标志,文件大小,最近访问时间,修改时间,压缩路径,备份路径。
  2. 备份在云服务器的所有文件信息用json字符串的形式备份在一个backfileinfo文件持久化存储。
  3. 当服务器在启动的时候,文件信息管理模块会将backfileinfo文件中的所有的文件信息读取上来,将
  4. 所有的文件信息以备份路径-FileInfo的形式进行映射在哈希表中,方便服务器查询文件信息。

🌳.FileInfo类的设计

FileInfo类的变量:

  • 压缩标志:用来判断文件是否被压缩
  • 备份路径:文件存储在热点的目录的路径,一般为/packdir/test.txt
  • 压缩路径:文件存储在非热点目录的路径,一般为/backdir/test.txt
  • url:文件下载请求的路径,一般为/download/test.txt
  • 文件大小
  • 最后一次访问的时间
  • 最后一次修改的时间

FileInfo类的构造函数,使用配置模块和文件工具类初始化FileInfo中的成员变量

 #include"Config.hpp"   class FileInfo{                         public:                                 bool pack_sign;    size_t file_size;                               time_t access_time;    time_t modify_time;       std::string back_path;    std::string pack_path;                      std::string url;                     public:                     FileInfo(const std::string& backpath){                     AddFileInfo(backpath);                                   }                                                         FileInfo(){}                                              bool AddFileInfo(const std::string& backpath){         sjp::FileUtil fu(backpath.c_str());                   file_size=fu.GetFileSize();                  pack_sign=false;       access_time=fu.GetFileAccessTime();    modify_time=fu.GetFileModfityTime();    back_path=sjp::Config::GetInstant()->GetBackDir();    back_path+=fu.GetFilename();    pack_path=sjp::Config::GetInstant()->GetPackDir();    pack_path+=fu.GetFilename();    pack_path+=sjp::Config::GetInstant()->GetPackFileSuffix();    url="/download/";    url+=fu.GetFilename();    return true;                                  }                               };    

🌳. FileInfoManger类的设计(文件信息管理类)

 🍎.FileInfoManger类的成员变量

  • file_info_path:backfileinfo文件路径,方便加载文件信息。
  • _table:哈希表,将文件的备份路径与文件信息映射起来,方便服务器能够查找文件信息。
  • _rwlock:读写锁,保证信息管理模块在访问和修改哈希表的过程中线程安全的。

🍎.成员函数

InitLoad函数

InitLoad函数的功能加载backfileinfo文件中的所有的文件信息加载到FileInfoManger对象里面。

        //将文件上的信息加载到内存中bool InitLoad(){/** 1.打开备份文件的存储信息2.将存储信息读取到body中3.将body进行反序列化为root;4.将各个文件信息加载到table中*/sjp::FileUtil fu(file_info_path.c_str()); std::string body;fu.GetContent(body);Json::Value root;sjp::JsonUtil::UnSerialize(root,body);
W>        for(int i=0;i

UpdateFileInfo函数 

UpdateFileInfo的功能是查看backdir下的文件信息是否全都存储在backfileinfo,如果某些文件没有存储,则将该文件的信息存储进backfileinfo里面。

实现思路:

  • 获取backdir下的所有文件,将所有的文件与_table进行比对。
  • 如果某个文件在_table中没有找到,说明该文件信息没有持久化进backfileinfo文件里,创建该文件信息,将该文件的信息插入到_table,最后在将更新backfileinfo中的数据。
        bool UpdateFileInfo(){std::string path=sjp::Config::GetInstant()->GetBackDir();sjp::FileUtil fu(path);std::vector arry;fu.GetPathInDir(arry);W>        for(int i=0;i//没有将该文件信息存储到信息系统中sjp::FileInfo fileinfo(arry[i]); Insert(fileinfo);}}Storage();
W>      }

 Storage函数 

 Storage函数的功能将_table中的所有信息持久化存储到backfileinfo文件里面。

实现思路:

  • 将_table上的所有的文件信息都存储在Json::Value root中,在将root序列化为Json字符串,最后再通过文件工具类打开backfileinfo文件,将Json字符串写入到backfile文件中。
        //将table上的所有信息存储持久化到文件上bool Storage(){//将文件的备份信息反序列化字符并组织到body上std::string filebody;Json::Value root; std::string body;auto it=_table.begin();int i=0;while(it!=_table.end()){root[i]["AccessTime"]=(Json::Int)it->second.access_time;    root[i]["ModifyTime"]=(Json::Int)it->second.modify_time;    root[i]["FileSize"]=(Json::Int)it->second.file_size;    root[i]["Url"]=it->second.url;    root[i]["PackSign"]=it->second.pack_sign;                                                                                                                                        root[i]["BackPath"]=it->second.back_path;    root[i]["PackPath"]=it->second.pack_path;i++;it++;}sjp::JsonUtil::Serialize(root,body);sjp::FileUtil fu(file_info_path.c_str());if(!fu.SetContent(body)){return false;}return true;}

UpdatePackSign函数

UpdatePackSign函数的功能是将packdir中的下文件信息中的压缩标志为false,则更改为true,表示该文件已经被压缩。

        bool UpdatePackSign(){cout<<"Updatepacksign"<second.pack_path);if(fu.Exist()){it->second.pack_sign=true;Insert(it->second);}it++;}Storage();
W>      }

 构造函数

  • 云备份服务器启动时,需要先使用InitLoad函数将backfileinfo中的文件加载到_table中。
  • 利用UpdateFileInfo函数更新backdir目录下的文件没有存放进backfileinfo文件信息。
  • 利用 UpdatePackSign函数将packdir目录下文件的文件信息的压缩标志是false修改为true;
        FileInfoManger(){file_info_path=Config::GetInstant()->GetBackFileInfo();pthread_rwlock_init(&_rwlock,NULL);InitLoad(); UpdateFileInfo();UpdatePackSign();}

其它函数

  #pragma once                                                                                                                                                                              #include"Config.hpp"      #include    #include                    namespace sjp{                         class FileInfoManger{                                                                                                                                                                   private:std::string file_info_path;//存储文件信息的持久化文件std::unordered_map _table; //backpath-infopthread_rwlock_t _rwlock;//读写锁private:static FileInfoManger* instant;static std::mutex lock;private:FileInfoManger(FileInfoManger&)=delete;public:static FileInfoManger* GetInstant(){    if(instant==nullptr){    lock.lock();    if(instant==nullptr){    instant=new FileInfoManger();    }    lock.unlock();    }    return instant;    }     //插入信息bool Insert(const FileInfo& info){pthread_rwlock_wrlock(&_rwlock);_table[info.back_path]=info;pthread_rwlock_unlock(&_rwlock);return true;}//更新信息bool update(const FileInfo& info){pthread_rwlock_wrlock(&_rwlock);_table[info.back_path]=info;pthread_rwlock_unlock(&_rwlock);return true;}         //通过backpath判断该文件是否存在bool Exist(const std::string& backpath){auto it=_table.find(backpath);if(it!=_table.end()){return true;}return false;}//通过url获取文件信息bool GetoneByURL(const std::string& url,FileInfo& info){sjp::FileUtil fu(url);        std::string backpath=sjp::Config::GetInstant()->GetBackDir();backpath+=fu.GetFilename();return  GetOneByRealPath(backpath,info);}//通过相对路径获取文件信息bool GetOneByRealPath(const std::string& backpath,FileInfo& info){auto it=_table.find(backpath);if(it!=_table.end()){info=it->second;return true;}return false;}//获取所有备份文件的文件信息bool GetAllInfo( std::vector& arry){pthread_rwlock_wrlock(&_rwlock);auto it=_table.begin();while(it!=_table.end()){arry.push_back(it->second);it++;}pthread_rwlock_unlock(&_rwlock);return true;}~FileInfoManger(){Storage();}};FileInfoManger* FileInfoManger::instant=nullptr;std::mutex FileInfoManger::lock;}                                          

相关内容

热门资讯

求洪荒大神穿越或重生到异世界的... 求洪荒大神穿越或重生到异世界的小说如《云中子异界游》云中子这个我倒是没有看过不过我把我喜欢的介绍给你...
求一篇文笔很赞的情书 求一篇文笔很赞的情书[你是我一生最唯命的执着,天荒地老] [你是我无荒爱的堇色年华,千秋万世]...
赛尔号打麒麟,有圣者炎龙,暴风... 赛尔号打麒麟,有圣者炎龙,暴风女,圣天使,先手消强2只,美队,求全攻略。需要其他就说。大哥供热挖人通...
爱与被爱,我该如果选择? 爱与被爱,我该如果选择?最好是双方都相爱不过如果真的要在爱与被爱中作出选择的话如果是我,我会选择爱被...
如果一个机会摆在我们面前,我们... 如果一个机会摆在我们面前,我们应该当机立断的抓住还是考虑考虑再决定?如果一个机会摆在我们面前,我们应...
斗罗大陆漫画单行本总共有几册? 斗罗大陆漫画单行本总共有几册?到目前为止,出了12册了。目前出了13本,但进度很慢,平均六~七本漫画...
瑜伽教练喜欢学员的表现 瑜伽教练喜欢学员的表现主动聊天。如果教练喜欢学员,会特别主动,包括主动聊天,主动帮助解决一切能够解决...
有什么开局剧情设计就很精彩的动... 有什么开局剧情设计就很精彩的动画作品值得安利?以下是一些开局剧情设计精彩的动画作品:1.《你的名字》...
拟物的例子 拟物的例子 拟物的例子:1、忽如一夜春风来,千树万树梨花开。以梨花比雪花,作者的原意是描写雪花。...
你喜欢看木偶奇遇记吗请你写出喜... 你喜欢看木偶奇遇记吗请你写出喜欢的理由为大家推荐一下这本书? 木偶奇遇记的作者简介《木偶奇遇记》...
巴金月夜中的根生是小说的主要人... 巴金月夜中的根生是小说的主要人物,但小说中并没有一处直接描写,试探究小说这样安排的用意  这大概是为...
其实狠狠记得我的伤口 求歌名 其实狠狠记得我的伤口 求歌名有点印象,困橘应该是下边这首,之前在威信 每晚睡前音乐 听到过,不是很...
刘耀文生日直播谁来了 刘耀文生日直播谁来了刘耀文生日直播那天张真源来了,张真源是中国内地流行乐男歌手、演员,男子演唱组合时...
对于郭富城发文庆祝出道30周年... 对于郭富城发文庆祝出道30周年,网友都说了什么?是陪伴粉丝成长的30年,对郭富城精湛的舞技、精彩的演...
李白是什么代诗人,被誉为什么,... 李白是什么代诗人,被誉为什么,他和谁并称为李杜,你读过他的诗有什么李白是唐代诗人,被誉为诗仙,他和杜...
一个普普通通的穷小子打工仔要翻... 一个普普通通的穷小子打工仔要翻身怎么办毫无办法普普通通的打工仔,也不是没有翻身的机会,只是要付出很多...
张国立主演的电视连续剧《财神到... 张国立主演的电视连续剧《财神到》是哪一年播出的?希望详细点、谢谢重大网友。1999年 《财神到》 饰...
20 天大的小猫喷了〔丽丝宠物... 20 天大的小猫喷了〔丽丝宠物杀虫剂〕几分钟后开始吐白沫!宠物店老板跟我再三说了!没事!也给他说了是...
(康桑啊密达)韩语是什么意思? (康桑啊密达)韩语是什么意思?敬语体,谢谢的意思
别人夸你漂亮时该如何幽默的回答... 别人夸你漂亮时该如何幽默的回答?当别人夸你漂亮时,你可以说:谢谢夸奖,谢谢你对我的认可,可惜啊我不靠...