【云备份|| 日志 day2】FileUtil JsonUtil

这几天感冒了,稍微落下了进度

在这里插入图片描述

util工具

fileUtil(文件操作类)

在客户端,又或者是在服务端,本质是都是对文件的读写和管理,所以有必要封装一个文件操作类

class FileUtil{
private:std::string _name;
public:FileUtil(const std::string &name);size_t FileSize();// 文件大小time_t LastATime(); // 最后一次查看文件时间time_t LastMTime(); // 最后一次修改文件的时间std::string FileName();   //文件名字bool GetPosLen(std::string *content, size_t pos, size_t len);  //获取文件流pos 后len个长度的数据bool GetContent(std::string *content);  //获取文件内容bool SetContent(std::strint *content);   //写入文件bool Compress(const std::string &packname);   //压缩文件bool UnCompress(const std::string &filename);  //解压文件bool Exists();     //判断文件是否存在bool CreateDirectory();    //创建一个目录bool ScanDirectory(std::vector<std::string> *arry);  //查看目录下的文件内容}

JsonUtil

服务端和客户端进行对话,传输数据,一定要跨网络传输,就一定需要将数据序列化(Serialize)和反序列化(UnSerialize)。

class JsonUtil{
public:static bool Serialize(const Json::Value &root, std::string *str);  //序列化static bool UnSerialize(const std::string &str, Json::Value *root);   //反序列化
};

注意
编译时,我们需要链接第三方库

-lpthread -lstdc++fs -ljsoncpp -lbundle

-lpthread ,-lbundle: bundle.h中调用了线程库,所以需要链接。

-lstdc++fs : 文件中关于目录部分的函数编写调用了filesystem中的函数。

-ljsoncpp :序列和反序列化时需要。

代码

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <experimental/filesystem>
#include <sys/stat.h>
#include <jsoncpp/json/json.h>
#include "bundle.h"namespace cloud{namespace fs = std::experimental::filesystem;class FileUtil{private:std::string _filename;public:FileUtil(const std::string &filename):_filename(filename){}bool Remove(){if (this->Exists()== false) {return true;}remove(_filename.c_str());return true;}int64_t FileSize(){struct stat st;if (stat(_filename.c_str(), &st) < 0) {std::cout << "get file size failed!\n";return -1;}return st.st_size;}time_t LastMTime(){struct stat st;if (stat(_filename.c_str(), &st) < 0) {std::cout << "get file size failed!\n";return -1;}return st.st_mtime;}time_t LastATime() {struct stat st;if (stat(_filename.c_str(), &st) < 0) {std::cout << "get file size failed!\n";return -1;}return st.st_atime;}std::string FileName(){// ./abc/test.txtsize_t pos = _filename.find_last_of("/");if (pos == std::string::npos) {return _filename;}return _filename.substr(pos+1);}bool GetPosLen(std::string *body, size_t pos, size_t len){size_t fsize = this->FileSize();if (pos + len > fsize){std::cout << "get file len is error\n";return false;}std::ifstream ifs;ifs.open(_filename, std::ios::binary);if (ifs.is_open() == false) {std::cout << "read open file failed!\n";return false;}ifs.seekg(pos, std::ios::beg);body->resize(len);ifs.read(&(*body)[0], len);if (ifs.good() == false) {std::cout << "get file content failed\n";ifs.close();return false;}ifs.close();return true;}bool GetContent(std::string *body) {size_t fsize = this->FileSize();return GetPosLen(body, 0, fsize);}bool SetContent(const std::string &body) {std::ofstream ofs;ofs.open(_filename, std::ios::binary);if (ofs.is_open() == false) {std::cout << "write open file failed!\n";return false;}ofs.write(&body[0], body.size());if (ofs.good() == false) {std::cout << "write file content failed!\n";ofs.close();return false;}ofs.close();return true;}bool Compress(const std::string &packname){//1. 获取源文件数据std::string body;if (this->GetContent(&body) == false){std::cout << "compress get file content failed!\n";return false;}//2. 对数据进行压缩std::string packed = bundle::pack(bundle::LZIP, body);//3. 将压缩的数据存储到压缩包文件中FileUtil fu(packname);if (fu.SetContent(packed) == false){std::cout << "compress write packed data failed!\n";return false;}return true;}bool UnCompress(const std::string &filename) {//将当前压缩包数据读取出来std::string body;if (this->GetContent(&body) == false){std::cout << "uncompress get file content failed!\n";return false;}//对压缩的数据进行解压缩std::string unpacked = bundle::unpack(body);//将解压缩的数据写入到新文件FileUtil fu(filename);if (fu.SetContent(unpacked) == false){std::cout << "uncompress write packed data failed!\n";return false;}return true;}bool Exists() {return fs::exists(_filename);}bool CreateDirectory() {if (this->Exists()) return true;return fs::create_directories(_filename);}bool ScanDirectory(std::vector<std::string> *arry) {for(auto& p: fs::directory_iterator(_filename)) {if (fs::is_directory(p) == true){continue;}//relative_path 带有路径的文件名arry->push_back(fs::path(p).relative_path().string());}return true;}};class JsonUtil{public:static bool Serialize(const Json::Value &root, std::string *str){Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss; if (sw->write(root, &ss) != 0) {std::cout << "json write failed!\n";return false;}*str = ss.str();return true;}static bool UnSerialize(const std::string &str, Json::Value *root){Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), root, &err);if (ret == false) {std::cout << "parse error: " << err << std::endl;return false; }return true;}};
}

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

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

相关文章

【入门Flink】- 02Flink经典案例-WordCount

WordCount 需求&#xff1a;统计一段文字中&#xff0c;每个单词出现的频次 添加依赖 <properties><flink.version>1.17.0</flink.version></properties><dependencies><dependency><groupId>org.apache.flink</groupId><…

python小工具分享:优雅地实现进度条和系统通知

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 趁着休息的空隙&#xff0c;研究了一下两个比较有意思的脚本&#xff0c;在日常的使用中很…

MySQL用户管理和授权

目录 一.用户管理 1.1.新建用户 1.2.查看用户 1.3.重命名用户rename 1.4.删除用户 1.5.修改当前登录用户密码 1.6.修改其他用户密码 1.7.忘记root 密码并找回 二.数据库用户授权 2.1.all privilege包含的权限 2.2.授予权限 ①允许指定用户查询指定数据库表 ②允许…

初识Vue 输出Hello World 及注意事项

在我们还没接触Vue之前&#xff0c;我同学常说我可以直接在元素里输出JS的表达式吗&#xff1f;肯定是不太行。当我们接触vue.js后&#xff0c;这个想法成了现实。 每当我们学习一门新的语言或者框架时&#xff0c;我们都习惯打印一个“hello world”&#xff0c;在我们vue当中…

Node.js基础-三大模块

文章目录 一、概念对比作用总结 二、fs文件模块三、path路径模块四、http模块服务器相关概念IP地址域名和域名服务器端口号 创建基本的web服务器基本步骤req请求对象res响应对象根据不同的url响应不同的html内容 总结 一、概念 借助浏览器引擎&#xff08;提供BOM&#xff0c;…

【机器学习】一、机器学习概述与模型的评估、选择

机器学习简介 由来 阿瑟.萨缪尔Arthur Samuel,1952年研制了一个具有自学习能力的西洋跳棋程序&#xff0c;1956年应约翰.麦卡锡John McCarthy&#xff08;人工智能之父&#xff09;之邀&#xff0c;在标志着人工智能学科诞生的达特茅斯会议上介绍这项工作。他发明了“机器学习…

系列十五、idea全局配置

一、全局Maven配置 IDEA启动页面>Customize>All settings>Build,Execution,Deployment>Build Tools>Maven 二、全局编码配置 IDEA启动页面>Customize>All settings>Editor>File Encodings 三、全局激活DevTools配置 IDEA启动页面>Customize>A…

python连接clickhouse (CK)

Author: tkhywang 2810248865qq.com Date: 2023-11-01 11:28:58 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-11-01 11:36:25 FilePath: \PythonProject02\Python读取clickhouse2 数据库数据.py Description: 这是默认设置,请设置customMade, 打开koroFileHead…

61. 旋转链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;李歘歘的博客 &#x1f3c6; &#x1f33a;每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点&#xff0c;以及职场小菜鸡的生活。&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&am…

Android开发知识学习——Kotlin进阶

文章目录 次级构造主构造器init 代码块构造属性data class相等性解构Elvis 操作符when 操作符operatorLambdainfix 函数嵌套函数注解使用处目标函数简化函数参数默认值扩展函数类型内联函数部分禁用用内联具体化的类型参数抽象属性委托属性委托类委托 Kotlin 标准函数课后题 次…

JavaWeb 怎么在servlet向页面输出Html元素?

service()方法里面的方法体&#xff1a; resp.setContentType("text/html;charsetutf-8");//获得输出流PrintWriter对象PrintWriter outresp.getWriter();out.println("<html>");out.println("<head><title>a servlet</title>…

EASYX实现多物体运动

eg1:单个物体运动使用easyx实现单个小球的运动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14 #define NODE_WIDTH 4…