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

news/2024/12/22 23:56:23/

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

在这里插入图片描述

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.ppmy.cn/news/1194551.html

相关文章

Mysql Binlog日志

Mysql Binlog是二进制格式的日志文件&#xff0c;但是不能把binlog文件等同于OS系统某目录下的具体文件&#xff0c;这是狭隘的。Binlog是用来记录Mysql内部对数据库的改动&#xff08;只记录对数据的修改操作&#xff09;&#xff0c;主要用于数据库的主从复制、数据同步以及增…

flask踩坑集锦

很久之前用过flask&#xff0c;那时候是跟着教程&#xff0c;教程怎么做我就怎么做&#xff0c;没有仔细考虑过。 现在是全靠文档和搜索一步一步搭建&#xff0c;忘了很多东西&#xff0c;就碰了很多壁&#xff0c;浅浅记录一下子。 1.Jinja2的模板继承&#xff0c;是指抽出每…

硬件知识积累 CAN 总线接口

1. CAN 总线协议的介绍 控制器局域网总线&#xff08;CAN&#xff0c;Controller Area Network&#xff09;是一种用于实时应用的串行通讯协议总线&#xff0c;它可以使用双绞线来传输信号&#xff0c;是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通…

JDBC 使用 PreparedStatement 实现批量数据操作

1 批量插入 1.1 批量执行SQL语句 当需要成批插入或者更新记录时&#xff0c;可以采用Java的批量更新机制&#xff0c;这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面三个方法&#xff1a; addBatch(String…

oracle 日期

日期加减 Oracle中日期进行加减可以使用多种方式&#xff0c;以下介绍三种 一种是针对天的操作&#xff0c;适用于对日&#xff0c;时&#xff0c;分&#xff0c;秒的操作&#xff0c; 一种是对月的操作&#xff0c;适用于月&#xff0c;年的操作&#xff0c; 一种是使用INTER…

第48天:内置对象方法、 前端基础之BOM和DOM

内置对象方法 RegExp对象 // 定义正则表达式两种方式 var reg1 new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); var reg2 /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;// 正则校验数据 reg1.test(jason666) reg2.test(jason666)/*第一个注意事项&#xff0c;正则表达式中不能有空格…

JDBC数据库连接---附通用的CRUD类

文章目录 JDBC数据库连接1 导包2 编写配置文件3 编写连接数据库代码4 测试工具类5 附加1 通用的CRUD类2 测试CURD类3 测试 JDBC数据库连接 本篇文章以 MySQL 数据库为例&#xff0c;若要切换其他数据库&#xff0c;只需修改 resource文件夹中的 jdbc.properties 配置文件即可。…

Qt中正确的设置窗体的背景图片的几种方式

Qt中正确的设置窗体的背景图片的几种方式 QLabel加载图片方式之一Chapter1 Qt中正确的设置窗体的背景图片的几种方式一、利用styleSheet设置窗体的背景图片 Chapter2 Qt的主窗口背景设置方法一&#xff1a;最简单的方式是通过ui界面来设置&#xff0c;例如设置背景图片方法二 &…