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

一,文件实用类设计实现

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

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

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

设计接口如下

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 ScanDirectory();//压缩文件&解压文件bool Compress(const std::string& packname);bool UnCompress(const std::string& filename);bool Remove();private:std::string _filename;};

代码实现如下

注意创建目录和浏览目录文件用到了filesystem库,该库使用手册如下所示

Filesystem library - cppreference.com

namespace fs=std::experimental::filesystem;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 false;}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(){if(Exists()) return true;return fs::create_directories(_filename);}bool ScanDirectory(std::vector<std::string> *arry){for (auto &i : fs::directory_iterator(_filename)){if(fs::is_directory(i)==true)//如果文件是路径名则跳过{continue;}arry->push_back(fs::path(i).relative_path().string());}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;}bool Remove(){if (Exists() == false){std::cout << "object file unexist" << std::endl;return false;}remove(_filename.c_str());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"void Utiltest()
{// 测试大小,最后修改时间,最后访问时间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::vector<std::string> vs;ex.ScanDirectory(&vs);for(auto v:vs){std::cout<<v<<std::endl;}std::cout << "--------------------------------------" << std::endl;// 序列化const char *name1 = "张三";int age1 = 18;float grade1[3] = {77.1, 64.74, 56.11};Json::Value val;val["姓名"] = name1;val["年龄"] = age1;val["成绩"].append(grade1[0]);val["成绩"].append(grade1[1]);val["成绩"].append(grade1[2]);std::string str;mjw_cloud::JsonUtil::Serialize(val, &str);std::cout << str << std::endl;std::cout << "--------------------------------------" << std::endl;Json::Value root;mjw_cloud::JsonUtil::UnSerialize(str, &root);const char *name2 = root["姓名"].asCString();int age2 = root["年龄"].asInt();float grade2[3] = {0};grade2[0] = root["成绩"][0].asFloat();grade2[1] = root["成绩"][1].asFloat();grade2[2] = root["成绩"][2].asFloat();std::cout << "姓名:" << name2 << std::endl;std::cout << "年龄:" << age2 << std::endl;std::cout << "--------------------------------------" << std::endl;
}

结果如下

二,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.hqwc.cn/news/100891.html

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

相关文章

[机器学习]分类算法系列①:初识概念

目录 1、概念 2、数据集介绍与划分 2.1、数据集的划分 2.2、sklearn数据集介绍 2.2.1、API 2.2.2、分类和回归数据集 分类数据集 回归数据集 返回类型 3、sklearn转换器和估计器 3.1、转换器 三种方法的区别 3.2、估计器 3.2.1、简介 3.2.2、API 3.3、工作流程 …

static关键字

static 是Java中的一个关键字&#xff0c;它可以用于修饰类的成员变量和方法&#xff0c;具有特殊的含义和用途。下面是关于static关键字的主要用法和含义&#xff1a; 静态变量&#xff08;Static Variables&#xff09;&#xff1a; 静态变量也称为类变量&#xff0c;它们属于…

ZDH-权限模块

本次介绍基于ZDH v5.1.2版本 目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限模块-重要名词划分 ZDH权限模块-菜单管理 ZDH权限模块-角色管理 ZDH权限模块-用户配置 ZDH权限模块-权限申请 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽…

【Apollo】Apollo的入门介绍

阿波罗是百度发布的名为“Apollo&#xff08;阿波罗&#xff09;”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有连个远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔&#xff1a; 应用开源架构进行项目开发&#xff0c;特别是那…

Unity3D开发流程及注意事项

使用Unity3D开发游戏需要遵循一定的流程和注意事项&#xff0c;以确保项目的顺利进行并获得良好的结果。以下是一般的游戏开发流程以及一些注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 游…

RabbitMQ高级特性

目录 消息的可靠投递confirm和return Consumer Ack 消费端限流 TTL Time To Live&#xff08;存活时间/过期时间&#xff09; 死信队列&#xff08;死信交换机&#xff09; 延迟队列 日志与监控 rabbitmqctl管理和监控 消息追踪 消息的可靠投递confirm和return 持久…

2023全国大学生数学建模A题B题C题D题E题竞赛选题建议,思路模型

目录 国赛数学建模思路模型代码&#xff1a;9.7开赛后第一时间更新&#xff0c;完整思路获取见文末名片 一、题目选择 二、国赛摘要及论文写作技巧 1、国赛摘要 2、论文写作技巧 三、历年国赛真题及对应算法模型 完整国赛题思路模型获取见此 国赛数学建模思路模型代码&am…

[machine learning]误差分析,模型分析

1.目的是什么 当我们找到一个算法去计算某些东西的时候,我们通常要对这个算法进行一定的分析,比如时间复杂度,空间复杂度(前者更加重要),来进行比较,判断一个算法的优劣性. 对于一个训练的模型来说,同样需要某种模型来进行分析,例如代价函数等等,通过比较拟合程度,正确精度等…

AR眼镜: 与人并行的智能伙伴

AR眼镜&#xff1a; 与人并行的智能伙伴 增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;眼镜是一种将虚拟信息与真实世界进行融合的设备&#xff0c;通过眼镜或头戴设备让用户能够看到真实世界&#xff0c;并在其上叠加数字内容和图像。目前工业级AR眼镜已…

vue表格不显示列号123456

我在网上找了半天&#xff0c;都是如何添加列号123456的&#xff0c;没有找到不显示列号的参考&#xff0c;现在把这个解决了&#xff0c;特此记录一下。 没有加右边的就会显示&#xff0c;加上右边的就隐藏了

基于SSM的教务管理

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 我们的系统是一个现代…