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

news2025/4/28 13:26:48

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

在这里插入图片描述

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.txt
				size_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.coloradmin.cn/o/1160848.html

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

相关文章

Unity Editor工具,导出unitypackage可选择是否包含脚本

概述 Unity自带的Export Package...功能&#xff0c;如果选中资源中包含脚本&#xff0c;或者Prefab挂载了自定义的脚本。在之后弹出的选择框内&#xff0c;如果勾选了Include dependencies会将整个项目所有的脚本全部都包含在内。等于导入了很多不相关的代码。如果取消勾选In…

Express框架开发接口之req.params、req.query与req.body的区别

1.req.query 用于get请求 http://localhost:3000/user?usernameljz&age1 获取 URL 中携带的查询参数 通过req.query对象&#xff0c;可以访问到客户端通过查询字符串的形式&#xff0c;发送到服务器的参数&#xff1a; 2.req.params 用于get请求 url路径为&#xff…

Ubuntu MySQL客户端功能介绍(mysql-client)mysql命令(mysql客户端命令)数据库导出、数据库导入

文章目录 Ubuntu MySQL客户端(mysql-client)功能介绍MySQL客户端与服务端服务器端&#xff08;MySQL Server&#xff09;客户端&#xff08;MySQL Client&#xff09; 安装MySQL客户端连接到MySQL服务器&#xff08;mysql -h host -u user -p&#xff09;执行SQL查询批处理模式…

SpringCloud-Alibaba-Seata

SpringCloud-Alibaba-Seata 注意&#xff1a;最好使用JDK1.8&#xff0c;使用JDK17整合seata会出现一些问题&#xff01;&#xff01;&#xff01; Docker部署Seata1.5.2 1&#xff1a;拉取Seata1.5.2镜像&#xff1a; docker pull seataio/seata-server:1.5.22&#xff1a;在…

C/C++奇数求和 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C奇数求和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C奇数求和 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 计算非负整数 m 到 n&#xff08;包括m 和 n &#xff…

驱动开发11-2 编写SPI驱动程序-点亮数码管

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h>int m74hc595_probe(struct spi_device *spi) {printk("%s:%d\n",__FILE__,__LINE__);char buf[]{0XF,0X6D};spi_write(spi,buf,sizeof(buf));return 0; …

HNU-数据库系统-讨论课1

第一次小班讨论课安排如下: 主题: 大数据管理及前沿技术讨论 目的&#xff1a;让学生了解大数据管理的相关理论、技术和系统。 内容: &#xff08;1&#xff09;大数据概念、应用、技术的相关知识。 &#xff08;2&#xff09;AI4DB &#xff08;3&#xff09;DB4AI &…

代码随想录打卡第五十八天|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 题目&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 题目链接&#xff1a; 583. 两个字符串的删除操作 解题思路&#xff1a; dp数组的含义&am…

基于springboot漫画动漫网站

基于springbootvue漫画动漫网站 摘要 基于Spring Boot的漫画动漫网站是一个精彩的项目&#xff0c;它结合了现代Web开发技术和漫画爱好者的热情。这个网站的目标是为用户提供一个便捷的平台&#xff0c;让他们能够欣赏各种漫画和动漫作品&#xff0c;与其他爱好者分享他们的兴趣…

Linux启动故障排错

Linux启动过程 开机流程、模块管理-CSDN博客 Grub三个阶段 1st stage&#xff1a;执行Grub主程序。Grub安装在MBR。由于MBR太小&#xff0c;所以与配置文件分开放1.5 stage&#xff1a;识别不同的文件系统2nd stage&#xff1a;加载Grub配置文件 /boot/grub2/grub.cfg。配置…

wordpress上传限制2M修改为256M的两种方式

方式一&#xff1a;修改php.ini 上传文件限制大小主要是php的php.ini配置决定的&#xff0c;所以只要找到php的配置文件&#xff0c;并且修改里面的配置即可&#xff0c;linux查看php的版本和配置文件位置的命令&#xff1a; php -i | grep "Configuration File" 一…

PTA 函数题(C语言)-- 阶乘计算升级版

题目title&#xff1a; 阶乘计算升级版 题目作者&#xff1a; 陈越 浙江大学 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义&#xff1a; void Print_Factorial ( const int N ); 其中N是用户传入的参数&#xff0c;其值不超过1000。如果N是非负整数&#…

操作系统:文件管理(一)文件系统基础

一战成硕 4.1 文件系统基础4.1.1 文件的基本概念4.1.2 文件控制块和索引结点4.1.3 文件的操作4.1.4 文件保护4.1.5 文件的逻辑结构4.1.6 文件的物理结构 4.1 文件系统基础 4.1.1 文件的基本概念 文件是以硬盘为载体的存储在计算机上的信息的结合。 在系统运行时&#xff0c;计…

用rust写web服务器笔记(11/1)

文章目录 一、创建一个具有监听链接功能web服务器二、读取请求内容三、编写web服务器返回网页(编写响应)四、编写web服务器有条件的返回网页五、编写多线程的web服务器六、用线程池实现web服务器七、实现线程池清除的web服务器八、读取文件 rust官网文档地址&#xff1a;https:…

传音影像团队图像超分辨领域的论文被国际计算机视觉顶级会议ICCV 2023录用

近日&#xff0c;国际计算机视觉大会 ICCV 2023&#xff08;International Conference on Computer Vision&#xff0c;简称ICCV&#xff09;在法国巴黎召开。传音影像团队与哈尔滨工业大学机器学习研究中心合作完成的图像超分辨领域的论文“MetaF2N: Blind Image Super-Resolu…

10个免费的设计素材网站分享,高效设计不是梦!

今天&#xff0c;我想和大家分享10个新的优秀设计资源网站&#xff0c;包括免费设计素材站、设计工具、字体等网站&#xff0c;特别是一些素材网站&#xff0c;都是免费下载的。而且相对来说&#xff0c;他们提供的设计素材的风格都是目前比较流行的&#xff0c;非常适合我们追…

Linux | 如何保持 SSH 会话处于活动状态

在远程服务器管理和安全数据传输中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是不可或缺的工具。然而&#xff0c;它的便利性和安全性有时会因常见的问题而受到损害&#xff1a;冻结 SSH 会话。 此外&#xff0c;session 的突然中断可能会导致工作丢失、项目延迟和无…

uniapp开发小程序无法上传图片的解决方法

登录小程序后台&#xff0c;第一步菜单栏 设置 第二步&#xff0c;用户隐私保护 更新 第三步 选2 第四步 勾选需要的接口&#xff0c;并说明 等审核通过后&#xff0c;一会就能正常上传图片。

深度学习之基于YoloV5火灾烟雾报警系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、火灾烟雾报警系统四. 总结 一项目简介 YoloV5 是深度学习中用于目标检测的一种算法&#xff0c;可以对输入的图像进行识别&#xff0c;标识出…

nodejs+vue+elementui+python家电销售分析系统设计与实现-计算机毕业设计

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 我们可以利用计算机技术来取代传统的管理模式&#xff0c;实现家电销售分析系统的…