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

一,文件实用类设计实现

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

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

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

设计接口如下

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.cstd::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.txtif(_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.rhkb.cn/news/117397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python爬虫案例】用python爬豆瓣音乐TOP250排行榜!

文章目录 一、爬虫对象-豆瓣音乐TOP250二、python爬虫代码讲解三、同步视频四、获取完整源码 一、爬虫对象-豆瓣音乐TOP250 您好&#xff0c;我是 马哥python说 &#xff0c;一名10年程序猿。 今天我们分享一期python爬虫案例讲解。爬取对象是&#xff0c;豆瓣音乐TOP250排行…

基于aarch64分析kernel源码 四:printk 内核打印

一、参考 Message logging with printk — The Linux Kernel documentation 如何获得正确的printk格式占位符 — The Linux Kernel documentation 使用printk记录消息 — The Linux Kernel documentation printk 内核打印 – 人人都懂物联网 (getiot.tech) 内核printk原理…

五金轴尺寸机器视觉测量软硬件方案--康耐德智能

检测内容&#xff1a; 五金轴尺寸机器视觉测量 检测要求&#xff1a; 精度0.015mm&#xff0c;速度180~240个/分钟 视觉可行性分析&#xff1a; 对样品进行了光学实验&#xff0c;并进行图像处理&#xff0c;原则上可以使用机器视觉系统进行测试测量。 结果&#xff1a; 对…

Python小知识 - 1. Python装饰器(decorator)

Python装饰器&#xff08;decorator&#xff09; Python装饰器是一个很有用的功能&#xff0c;它可以让我们在不修改原有代码的情况下&#xff0c;为已有的函数或类添加额外的功能。 常见的使用场景有&#xff1a; a. 函数缓存&#xff1a;对于一些计算量较大的函数&#xff0c…

Samba服务器

目录 一、什么是Samba&#xff1f; 二、Samba进程 三、Samba主要功能 四、Samba工作流程 五、Samba安全级别 六、Sam主配置文件/etc/samba/smb.conf 七、Samba服务配置案例 一、什么是Samba&#xff1f; Samba可以让linux计算机和windows计算机之间实现文件和打印机资源共享的一…

Homebrew下载安装及使用教程

Homebrew是什么&#xff1f; 简单来说&#xff0c;就是用命令行的形式去管理mac系统的包或软件。 安装命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"国内请使用镜像源进行下载 执行上述命令后会要求输入…

【设计模式】装饰者模式

5.3 装饰者模式 5.3.1 概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额外加钱&#xff0c;每个配菜的价钱通常不太一样&#xff0c;那么计算总价就会显得比较麻烦。 使用继承的…

vue3 ref reactive响应式数据 赋值的问题

文章目录 vue3 ref reactive响应式数据 赋值的问题场景1:将响应式数据赋值请求后的数据错误示范&#xff1a;直接赋值正确写法 场景2&#xff1a;响应式数据解构之后失去响应式原因分析解决办法 toRefs/toRef方法创建ref引用对象 vue3 ref reactive响应式数据 赋值的问题 doing…

[PyTorch][chapter 53][Auto Encoder 实战]

前言&#xff1a; 结合手写数字识别的例子&#xff0c;实现以下AutoEncoder ae.py: 实现autoEncoder 网络 main.py: 加载手写数字数据集&#xff0c;以及训练&#xff0c;验证&#xff0c;测试网络。 左图&#xff1a;原图像 右图&#xff1a;重构图像 ----main----- 每轮训…

bazel远程缓存(Remote Cache)

原理 您可以将服务器设置为构建输出&#xff08;即这些操作输出&#xff09;的远程缓存。这些输出由输出文件名列表及其内容的哈希值组成。借助远程缓存&#xff0c;您可以重复使用其他用户的 build 中的构建输出&#xff0c;而不是在本地构建每个新输出。 增量构建极大的提升…

开启EMQX的SSL模式及SSL证书生成流程

生成证书 首先&#xff1a;需要安装Openssl 以下是openssl命令 生成CA证书 1.openssl genrsa -out rootCA.key 2048 2.openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -subj "/CCN/STShandong/Ljinan/Oyunding/OUplatform/CNrootCA" -out ro…

unity 发布apk,在应用内下载安装apk(用于更大大版本)

*注意事项&#xff1a; 1&#xff0c;andriod 7.0 和 android 8.0是安卓系统的分水岭&#xff0c;需要分开来去实现相关内容2&#xff0c;注意自己的包名&#xff0c;在设置一些共享文件的时候需要放自己的包名3,以下是直接用arr包放入unity中直接使用的&#xff0c;不需要导入…

尚硅谷SpringMVC (5-8)

五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页&#xff1a; Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…

安达发|APS软件排程规则及异常处理方案详解

随着科技的发展&#xff0c;工业生产逐渐向智能化、自动化方向发展。APS(高级计划与排程)软件作为一种集成了先进技术和理念的工业软件&#xff0c;可以帮助企业实现生产过程的优化和控制。其中&#xff0c;排程规则是APS软件的核心功能之一&#xff0c;它可以帮助企业合理安排…

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测&#xff1b; 2.运行环境…

Docker技术--Docker简介和架构

1.Docker简介 (1).引入 我们之前学习了EXSI&#xff0c;对于虚拟化技术有所了解&#xff0c;但是我们发现类似于EXSI这样比较传统的虚拟化技术是存在着一定的缺陷:所占用的资源比较多&#xff0c;简单的说&#xff0c;就是你需要给每一个用户提供一个操作平台&#xff0c;这一个…

一款windows的终端神奇,类似mac的iTem2

终于找到了一款windows的终端神奇。类似mac的iTem2 来&#xff0c;上神器 cmder cmder是一款windows的命令行工具&#xff0c;就是我们的linux的终端&#xff0c;用起来和linux的命令一样。所以我们今天要做的是安装并配置cmder ![在这里插入图片描述](https://img-blog.csdni…

Lnmp架构-Redis

网站&#xff1a;www.redis.cn redis 部署 make的时候需要gcc和make 如果在纯净的环境下需要执行此命令 [rootserver3 redis-6.2.4]# yum install make gcc -y 注释一下这几行 vim /etc/redis/6739.conf 2.Redis主从复制 设置 11 是master 12 13 是slave 在12 上 其他节…

python 深度学习 解决遇到的报错问题4

目录 一、DLL load failed while importing _imaging: 找不到指定的模块 二、Cartopy安装失败 三、simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 四、raise IndexError("single positional indexer is out-of-bounds") 五、T…

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…