云备份——实用类工具实现

news2024/11/16 13:50:33

一,文件实用类设计实现

不管是客户端还是服务端,文件的传输备份都涉及到文件的读写,包括数据管理信息的持久化也是如此,因此首先设计封装文件操作类,这个类封装完毕之后,则在任意模块中对文件进行操作时都将变的简单化。

我们对文件的操作主要有以下几种,也就是我们文件实用类需要实现的功能

  • 获取文件大小
  • 获取文件最后一次修改时间(客户端在判断文件是否需要上传时需要用到)
  • 获取文件最后一次访问时间(判断文件是否属于热点文件就是通过最后一次访问时间)
  • 获取文件路径中的文件名
  • 向文件写入数据、获取文件数据
  • 获取文件指定位置,指定长度的数据(断点重传功能的实现需要该接口)
  • 判断文件是否存在
  • 创建文件目录、获取文件目录
  • 压缩文件、解压文件

设计接口如下

class FileUtil
    {
    public:
        //获取文件大小
        size_t size();
        //获取文件最后一次修改时间&最后一次访问时间
        time_t LastMTime();
        time_t LastATime();
        //获取文件路径名中的文件名
        std::string FileName();
        //向文件写入数据&向文件读取数据
        bool SetContent(const std::string& body);
        bool GetContent(std::string* body);
        //获取文件指定位置指定长度字符串
        bool GetPosLen(std::string* body,size_t pos,size_t len);
        //判断文件是否存在
        bool Exists();
        //创建文件目录&获取文件目录
        bool CreateDirectory();
        bool GetDirectory();
        //压缩文件&解压文件
        bool Compress(const std::string& packname);
        bool UnCompress(const std::string& filename);

    private:
        std::string _filename;
    };

代码实现如下

class FileUtil
    {
    public:
        FileUtil(const std::string& filename)
            :_filename(filename)
        {}
        //获取文件大小
        size_t FileSize()
        {
            struct stat st;
            if(stat(_filename.c_str(),&st)<0)
            {
                std::cout<<"get file attributes failed"<<std::endl;
                return -1;
            }
            return st.st_size;
        }
        //获取文件最后一次修改时间&最后一次访问时间
        time_t LastMTime()
        {
            struct stat st;
            if(stat(_filename.c_str(),&st)<0)
            {
                std::cout<<"get file attributes failed"<<std::endl;
                return -1;
            }
            return st.st_mtime;
        }
        time_t LastATime()
        {
            struct stat st;
            if(stat(_filename.c_str(),&st)<0)
            {
                std::cout<<"get file attributes failed"<<std::endl;
                return -1;
            }
            return st.st_atime;
        }
        //获取文件路径名中的文件名
        //./abc/test.c ->test.c
        std::string FileName()
        {
            int pos=_filename.find_last_of("/");
            if(pos<0)
            {
                std::cout<<"filename error"<<std::endl;
                return nullptr;
            }
            return _filename.substr(pos+1);
        }
        //获取文件指定位置指定长度字符串
        bool GetPosLen(std::string* body,size_t pos,size_t len)
        {
            std::ifstream ifs(_filename,std::ios::binary);
            if(ifs.is_open()==false)
            {
                std::cout<<"open file failed"<<std::endl;
                return false;
            }

            size_t size=this->FileSize();
            if(pos+len>size)
            {
                std::cout<<"Get filecontent is be illegal"<<std::endl;
                return 0;
            }
            ifs.seekg(pos,ifs.beg);
            body->resize(size);
            ifs.read(&(*body)[0],len);
            if(ifs.good()==false)
            {
                std::cout<<"read file failed"<<std::endl;
                return false;
            }
            ifs.close();
            return true;
        }

        //向文件写入数据&向文件读取数据
        bool SetContent(const std::string& body)
        {
            std::ofstream ofs(_filename,std::ios::binary);
            if(ofs.is_open()==false)
            {
                std::cout<<"SetContent open file failed"<<std::endl;
                return false;
            }

            ofs.write(&body[0],body.size());
            if(ofs.good()==false)
            {
                std::cout<<"write file failed"<<std::endl;
                return false;
            }
            ofs.close();
            return true;
        }

        bool GetContent(std::string* body)
        {
            size_t fsize=this->FileSize();
            return GetPosLen(body,0,fsize);
        }
        
        //判断文件是否存在
        bool Exists()
        {
            struct stat sm;
            return stat(_filename.c_str(),&sm)==0;
        }
        
        //创建文件目录&获取文件目录
        bool CreateDirectory()
        {
            // ./abc/ab/c.txt
                if(_filename.empty()) return false;
                if(exists(_filename)) return false;
                int pos=0,indox=0;

                while(indox<_filename.size())
                {
                    pos=_filename.find_first_of("/\\",indox);
                    

                    //当pos==npos时,说明pos到indox已经没有/,说该创建最后一个文件,创建完break即可
                    if(pos==std::string::npos)
                    {
                        mkdir(_filename.c_str(),0777);
                        break;
                    }
                    if(!exists(_filename.substr(0,pos))) mkdir(_filename.substr(0,pos).c_str(),0777);
                    indox=pos+1;
                }
                return true;
        }
        bool GetDirectory(std::string* filepath)
        {
            if(_filename.empty()) return false;
                int pos=_filename.find_last_of("/\\");
                if(pos==std::string::npos)//pos==npos说明没有找到
                {
                    return false;
                }
                *filepath=_filename.substr(0,pos+1);
                return true;
        }
        //压缩文件&解压文件
        bool Compress(const std::string& packname)
        {
            //1.读取文件内容
            std::string filebody;
            if(GetContent(&filebody)==false)
            {
                std::cout<<"get file body failed"<<std::endl;
                return false;
            }
            //2.压缩获取的内容
            std::string packbody;
            packbody=bundle::pack(bundle::LZIP,filebody);
            //3.将压缩的数据放到压缩包文件中
            FileUtil fu(packname);
            if(fu.SetContent(packbody)==false)
            {
                std::cout<<"compress write failed"<<std::endl;
                return false;
            }
            return true;
        }
        bool UnCompress(const std::string& filename)
        {
            //1.读取压缩文件内容
            std::string packbody;
            if(GetContent(&packbody)==false)
            {
                std::cout<<"get pack file body failed"<<std::endl;
                return false;
            }
            //2.解压读到的内容
            std::string filebody;
            filebody=bundle::unpack(packbody);
            //3.将解压后的内容放入文件中
            FileUtil fu(filename);
            if(fu.SetContent(filebody)==false)
            {
                std::cout<<"file write failed"<<std::endl;
                return false;
            }
            return true;
        }
    private:
        //用于类内使用
        bool exists(const std::string& filename)
        {
            struct stat sm;
            return stat(filename.c_str(),&sm)==0;
        }
    private:
        std::string _filename;
    };

测试代码

#include "util.hpp"

int main()
{
    //测试大小,最后修改时间,最后访问时间
    mjw_cloud::FileUtil fu("./test1.txt");
    std::cout<<fu.FileSize()<<std::endl;
    std::cout<<fu.LastMTime()<<std::endl;
    std::cout<<fu.LastATime()<<std::endl;
    std::cout<<"--------------------------------------"<<std::endl;

    //测试获取文件名,文件写入,文件读取
    std::cout<<fu.FileName()<<std::endl;
    std::string write("hello,word\n");
    std::cout<<write<<":";
    fu.SetContent(write);
    std::string read;
    fu.GetContent(&read);
    std::cout<<read<<std::endl;
    std::cout<<"--------------------------------------"<<std::endl;

    //压缩文件,解压文件
    fu.Compress("./test1.lzip");
    std::cout<<"压缩成功\n"<<std::endl;
    fu.UnCompress("./test1_lzip.txt");
    std::cout<<"解压成功\n"<<std::endl;

    std::cout<<"--------------------------------------"<<std::endl;

    //创建目录.获取文件目录
    mjw_cloud::FileUtil ex("./a/b/c");
    ex.CreateDirectory();
    std::string filepath;
    ex.GetDirectory(&filepath);
    std::cout<<filepath<<std::endl;

    std::cout<<"--------------------------------------"<<std::endl;
    return 0;
}

结果如下

二,Json实用类实现

该类主要是对Json序列化反序列化的通用代码进行一个封装,减少重复代码的实用

 

/*util.hpp*/
    class JsonUtil
    {
    public:
        static bool Serialize(const Json::Value &root, std::string *str)
        {
            Json::StreamWriterBuilder swb;
            std::shared_ptr<Json::StreamWriter> writer_ptr(swb.newStreamWriter());
            std::ostringstream sst;
            writer_ptr->write(root, &sst);
            *str = sst.str();
            return true;
        }
        static bool UnSerialize(const std::string &str, Json::Value *root)
        {
            std::string err;
            Json::CharReaderBuilder crb;
            std::shared_ptr<Json::CharReader> read_ptr(crb.newCharReader());
            read_ptr->parse(str.c_str(), str.c_str() + str.size(), root, &err);
            return true;
        }
    };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloudAlibaba OpenFeign整合及详解

SpringCloudAlibaba OpenFeign 在前面&#xff0c;我们使用Nacos服务注册发现后&#xff0c;服务远程调用可以使用RestTemplateRibbon或者OpenFeign调用。实际开发中很少使用RestTemplate这种方式进行调用服务&#xff0c;每次调用需要填写地址&#xff0c;还要配置各种的参数&…

Java 包装类和Arrays类(详细解释)

目录 包装类 作用介绍 包装类的特有功能 Arrays类 Arrays.fill() Arrays.toString() Arrays.sort() 升序排序 降序排序 Arrays.equals() Arrays.copyOf() Arrays.binarySearch() 包装类 作用介绍 包装类其实就是8种基本数据类型对应的引用类型。 基本数据类型引用…

R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列...

全文链接&#xff1a;http://tecdat.cn/?p31162 最近我们被客户要求撰写关于SV模型的研究报告&#xff0c;包括一些图形和统计输出&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 本文做SV模型&#xff0c;选取马尔可夫蒙特卡罗法(MCMC)、正则化广…

英码科技受邀亮相2023WAIE物联网与人工智能展,荣获行业优秀创新力产品奖!

8月28日-30日&#xff0c;2023WAIE 物联网与人工智能展在深圳福田会展中心顺利举办。英码科技受邀亮相本届展会&#xff0c;并现场重点展出了面向智慧交通、智慧校园、智慧应急、智慧园区等不同行业的创新AIoT产品、AI技术服务等内容&#xff0c;与生态伙伴积极探讨市场需求和问…

四川玖璨电子商务有限公司:短视频账户运营

短视频账户运营&#xff0c;是指对短视频内容进行管理和推广的工作。随着社交媒体的兴起和短视频平台的流行&#xff0c;短视频账户运营已经成为了一种新兴的营销方式。对于企业、个人或组织来说&#xff0c;通过短视频账户运营&#xff0c;不仅可以提高品牌知名度&#xff0c;…

C. Nice Garland

题目&#xff1a; 样例1&#xff1a; 输入 3 BRB 输出 1 GRB 样例2&#xff1a; 输入 7 RGBGRBB 输出 3 RGBRGBR 题意&#xff1a; 题目是要在一个字符它的前面两个和后面两个字符不能与它本身有相同的字符。即 范围在 3 之内的字符串不能有相同的字符。 思路&#xff1a; …

运算放大器总结

早期的运算放大器目的是制造模拟计算机&#xff0c;用来计算各种数学公式。虽然现在已经被数字电路替代了&#xff0c;但是运算放大器在模拟电路设计中&#xff0c;仍然是最重要的知识。 1、运放是怎么工作的&#xff1f; 以电压反馈型运放&#xff08;VFA&#xff09;为例。由…

什么是跨域问题 ?Spring MVC 如何解决跨域问题 ?Spring Boot 如何解决跨域问题 ?

目录 1. 什么是跨域问题 &#xff1f; 2. Spring MVC 如何解决跨域问题 &#xff1f; 3. Spring Boot 如何解决跨域问题 &#xff1f; 1. 什么是跨域问题 &#xff1f; 跨域问题指的是不同站点之间&#xff0c;使用 ajax 无法相互调用的问题。 跨域问题的 3 种情况&#x…

为了更好和大家交流,欢迎大家加我的微信账户

因为一些懂的都懂的原因&#xff0c;如果我的账户显示为 此时我无法通过站内信、留言或者任何方式和大家联系。 如果看到这样的内容&#xff0c;可以在此评论区留下你的微信账户&#xff0c;我看到后会添加你。为防止其他人冒充我&#xff0c;我的微信号以2206结尾。

OpenCV入门之基本知识

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 一、vscode文件配置 在vscode中需要配置如下三个文件&#xff1a;c_cpp_proper…

操作系统清华同步笔记:定义概述+计算机内存和硬盘布局+启动流程顺序+中断、异常和系统调用

定义概述 从用户角度来看&#xff0c;操作系统是一个控制软件&#xff0c;用以管理应用程序&#xff0c;为应用程序提供服务&#xff0c;杀死应用程序等。从内部文件角度来看&#xff0c;操作系统是一个资源管理器&#xff0c;用以管理外设&#xff0c;分配资源。层次结构&…

vue2 组件传值 转换

1. 字符串转数字类型&#xff08;string->number) parseInt() --十进制&#xff08;“123”--123&#xff09; parseFloat() --浮点数&#xff08;“123.345”--123.345&#xff09; Math.round(parseFloat()) --四舍五入&#xff08;“123.345”--123&#xff09; 2.父…

最详细Maven下载、安装、配置教程

Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目&#xff0c;其主要服务于基于Java平台的项目创建&#xff0c;依赖管理和项目信息管理。maven是Apache的顶级项目&#xff0c;解释为“专家&#xff0c;内行”&#xff0c;它是一个项目管理的工具&…

17 django框架(中)视图|模板

文章目录 框架介绍模型类视图视图的功能页面重定向 视图函数的使用url匹配过程错误视图补充 捕获url参数类型介绍 普通登录案例&#xff08;前情准备&#xff09;HttpReqeust 对象HttpResponse 对象QueryDict 对象&#xff08;即GET POST &#xff09;总结 ajaxajax的登录样例 …

面试中的商业思维:如何展示你对业务的理解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

华为数通方向HCIP-DataCom H12-821题库(单选题:221-240)

第201题 BGP 协议用​​ beer default-route-advertise​​ 命令来给邻居发布缺省路由,那么以下关于本地 BGP 路由表变化的描述,正确的是哪一项? A、在本地 BGP 路由表中生成一条活跃的缺省路由并下发给路由表 B、在本地 BGP 路由表中生成一条不活跃的缺省路由,但不下发给…

WordPress(4)关于网站的背景图片更换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改的位置1. 红色区域是要更换的随机的图片二、替换图片位置三.开启随机数量四.结束前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也…

算法通过村第五关-队列和Hash青铜笔记|队列和Hash

文章目录 前言1. Hash基础1.1 Hash的概念和基本特征1.2 碰撞处理方法1.2.1 开放地址法1.1.2 链地址法 2. 队列的基础2.1 队列的概念和基本特征2.2 队列的实现 总结 前言 提示&#xff1a;幸福的秘密是尽量扩大自己的兴趣范围对感兴趣的人和物尽可能的友善 --波特兰罗素 谈完栈&…

【人工智能】—_深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化

深度神经网络、卷积神经网络&#xff08;CNN&#xff09;、多卷积核、全连接、池化) 文章目录 深度神经网络、卷积神经网络&#xff08;CNN&#xff09;、多卷积核、全连接、池化)深度神经网络训练训练深度神经网络参数共享 卷积神经网络&#xff08;CNN&#xff09;卷积多卷积…

7.(Python数模)消防站的选址问题

Python解决消防站的选址问题 原文参考该博文 问题描述 源代码 import pulp # 导入 pulp 库# 主程序 def main():# 问题建模&#xff1a;"""决策变量&#xff1a;x(j) 0, 不选择第 j 个消防站x(j) 1, 选择第 j 个消防站, j1,8目标函数&#xff1a;min fx …