云备份项目--客户端编写

news2025/1/7 13:42:41

文章目录

  • 10. 客户端工具类
    • 10.1 整体的类
    • 10.2 测试
  • 11 客户端数据管理类
    • 11.1 整体的类
    • 11.2 测试
  • 12. 客户端业务处理
    • 12.1 整体的类

完整的代码–gitee链接

10. 客户端工具类

10.1 整体的类

在windows平台下进行开发,Util.hpp实际上是客户端FileUtil.hppJsonUtil.hpp的整合

/* 该类实现对文件和Json进行操作 */
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#define _CRT_SECURE_NO_WARNINGS
#ifndef __MY_UTIL__
#define __MY_UTIL__
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <string.h>
#include <json/json.h>
#include <experimental/filesystem>      // c++17 的文件系统库

namespace cloud
{
    namespace fs = std::experimental::filesystem;
    class FileUtil
    {
    private:
        std::string _fileName;
        struct stat _st;        // 用于获取文件的各种属性
    public:
        // 输入一个路径
        FileUtil(std::string fn) : _fileName(fn) {}

        // 获取文件大小(单位是字节)
        int64_t getFileSize();

        // 获取文件最后一次修改时间
        time_t getLastMTime();

        // 获取文件最后一次访问时间
        time_t getLastATime();

        // 获得一个路径最后文件的名称,例如/abc/a.txt -> a.txt
        std::string getFileName();

        // 从pos位置获取len长度的数据(单位是字节),写到s中
        bool getContentFromPos(std::string *s, size_t pos, size_t len);

        // 获取文件的所有内容,写到s中
        bool getFullContent(std::string *s);

        // 将字符串s的内容写入到文件中
        bool setContent(const std::string& s);

        // 判断文件是否存在,存在返回true
        bool exits();

        // 创建目录,创建成功返回true
        bool createDir();

        // 扫描文件夹下的文件,放到数组中
        bool scanDir(std::vector<std::string> *array);

        // 删除文件
        bool removeFile();
    };

    class JsonUtil
    {
    public:
        // 将root的序列化结果保存在str中
        static bool serialize(const Json::Value& root, std::string* str);

        // 将str的序列化结果保存在root中
        static bool unserialize(const std::string& str, Json::Value* root);
    };
}
#endif

10.2 测试

void testU1()
{
	std::vector<std::string> array;
	cloud::FileUtil fu("./");
	fu.scanDir(&array);
	for (const auto& e : array) {
		std::cout << e << '\n';
	}
}

void testU2()
{
    /* 序列化 */
    std::string name = "zhangsan";
    int age = 20;
    int scores[] = { 80, 90, 100 };
    // 给数据对象类添加数据
    Json::Value value;
    value["name"] = name;
    value["age"] = age;
    value["score"].append(scores[0]);
    value["score"].append(scores[1]);
    value["score"].append(scores[2]);
    std::string str;
    cloud::JsonUtil::serialize(value, &str);
    printf("序列化结果:\n %s\n%s\n", str.c_str(), "========================================");

    Json::Value oValue;
    /* 反序列化, 将s反序列化*/
    cloud::JsonUtil::unserialize(str, &oValue);
    printf("反序列化结果: \nname: %s\nage: %d\n",
        (oValue["name"].asString()).c_str(), oValue["age"].asInt());
    for (int i = 0; i < 3; ++i) {
        printf("成绩%d: %d\n", i, oValue["score"][i].asInt());
    }
}

int main()
{
    testU1();
    testU2();
	return 0;
}

输出如下

image-20250103160607333

11 客户端数据管理类

11.1 整体的类

DataManager.hpp,同样类似服务端,不过少了一些属性

/* 数据管理模块 */
#ifndef __MY_DATA_MANGER__
#define __MY_DATA_MANGER__
#include "Util.hpp"
#include <unordered_map>

namespace cloud
{
	class DataManager
	{
	private:
		std::unordered_map<std::string, std::string> _hash;		// key是文件名, value是文件的唯一标识
		std::string _backup;                                    // 备份的信息文件的路径
	public:
		// 初始化, 从配置文件中加载信息
		DataManager(const std::string backup) : _backup(backup) {}

		// 保存备份文件, 将所有文件的信息保存下来
		bool storageBackup();

		// 加载配置文件, 将其放到_hash中
		bool loadBackup();

		// 向哈希表中插入数据
		bool insertInfo(const std::string& key, const std::string& value);

		// 更新数据
		bool updateInfo(const std::string& key, const std::string& value);

		// 查询数据
		bool selectInfo(const std::string& key, std::string* str);
	};
};
#endif

11.2 测试

void testDM()
{
    cloud::DataManager dm(BACK_FILE);
    dm.insertInfo(".\\main.cpp", "aabb-ccd-dd");
    dm.insertInfo(".\\RUtil.hpp", "ee-ff-gg123");
    dm.storageBackup();
    std::string str;
    dm.selectInfo(".\\RUtil.hpp", &str);
    std::cout << str << '\n';
}
int main()
{
    testDM();
	return 0;
}

输出如下

image-20250103160946641

12. 客户端业务处理

12.1 整体的类

自动将指定文件夹中的文件备份到服务器

#include "DataManager.hpp"
#include "httplib.h"
#include <Windows.h>
#define SERVER_PORT 9000
const static std::string SERVER_IP = "124.70.203.1";
namespace cloud
{
    class Client
    {
    private:
        std::string _fileDir;       // 监测的文件夹
        std::string _backup;        // 备份的信息文件的路径
        cloud::DataManager* _dm;
    public:
        Client(const std::string fileDir, const std::string backup);

        ~Client();

        // 获取给定路径下文件的UniqueID
        bool getFileUniqueID(const std::string& fileName, std::string* str);

        // 将文件上传到服务器
        bool Upload(const std::string& filename);

        // 判断文件是否满足上传到服务器的条件
        bool isCanBeUpload(const std::string& filename);

        // 让客户端跑起来
        bool runService();
    };
}

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

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

相关文章

MySQL 的事务与多版本并发控制(MVCC)的那些事

什么是事务原子性:一致性隔离性 问题1: 为什么MySQL要使用mvcc实现隔离性而不使用 锁 解决并发问题?持久性 问题2: MySQL 不是磁盘数据库吗,持久化为什么是 redo log 保证的?问题 3: redo log 储存了什么东西,持久化(崩溃恢复是怎么做的?)问题 4 : MySQL 的 bing log (二进制…

Eplan 项目结构(高层代号、安装地点、位置代号)

Eplan中的项目结构分为3个层次&#xff1a; &#xff08;1&#xff09;功能面结构。指明这个系统的功能&#xff0c;有什么用途。在EPlan中&#xff0c;指的就是"高层代号&#xff08;&#xff09;"。 一般指的是线体。 &#xff08;2&#xff09;位置面结构。指明该…

OWASP ZAP之API 请求基础知识

ZAP API 提供对 ZAP 大部分核心功能的访问,例如主动扫描器和蜘蛛。ZAP API 在守护进程模式和桌面模式下默认启用。如果您使用 ZAP 桌面,则可以通过访问以下屏幕来配置 API: Tools -> Options -> API。 ZAP 需要 API 密钥才能通过 REST API 执行特定操作。必须在所有 …

短信通知在 IOS 17/18 中不起作用?这是修复方法

问题 “我最近将 iPhone 更新到了 iOS 17/18。我真的很兴奋&#xff0c;直到我发现 iOS 17/18 中没有 iMessage 文本通知。此后我的兴奋变成了失望。请告诉我如何解决这个问题&#xff1f; ” 我们知道这可能是一个大问题&#xff0c;因为我们通常不会打开消息应用程序&#…

从0开始的opencv之旅(1)cv::Mat的使用

目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒&#xff0c;但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理&#xff0c;这样在查找问题&#xff0c;或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…

机场安全项目|基于改进 YOLOv8 的机场飞鸟实时目标检测方法

目录 论文信息 背景 摘要 YOLOv8模型结构 模型改进 FFC3 模块 CSPPF 模块 数据集增强策略 实验结果 消融实验 对比实验 结论 论文信息 《科学技术与工程》2024年第24卷第32期刊载了中国民用航空飞行学院空中交通管理学院孔建国, 张向伟, 赵志伟, 梁海军的论文——…

《Rust权威指南》学习笔记(二)

枚举enum 1.枚举的定义和使用如下图所示&#xff1a; 定义时还可以给枚举的成员指定数据类型&#xff0c;例如&#xff1a;enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下&#xff0c;使用::进行分隔。 2.一个特殊的枚举Option&#xff0…

OSI模型的网络层中产生拥塞的主要原因?

&#xff08; 1 &#xff09;缓冲区容量有限&#xff1b;&#xff08; 1.5 分&#xff09; &#xff08; 2 &#xff09;传输线路的带宽有限&#xff1b;&#xff08; 1.5 分&#xff09; &#xff08; 3 &#xff09;网络结点的处理能力有限&#xff1b;&#xff08; 1 分…

linux上安装MySQL教程

1.准备好MySQL压缩包&#xff0c;并进行解压 tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /usr/local 2.检查是否有mariadb数据库 rpm -aq|grep mariadb 关于mariadb:是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目…

R语言中的时间序列分析·

1 数据集说明 AirPassengers 1949~1960年每月乘坐飞机的乘客数 JohnsonJohnson Johnson&Johnson每股季度收入 nhtemp 康涅狄格州纽黑文地区从1912年至1971年每年的平均气温 Nile 尼罗河的流量 sunspots 1749年~1983年月平均太阳黑子数 2 相关包 xts、forecast、tser…

LookingGlass使用

背景 Looking Glass 是一款开源应用程序&#xff0c;可以直接使用显卡直通的windows虚拟机。 常见环境是Linux hostwindows guest&#xff0c;基本部署结构图&#xff1a; 编译 git clone --recursive https://github.com/gnif/LookingGlass.git编译client mkdir client/b…

HCIA-Access V2.5_7_3_XG(S)原理_关键技术

为什么需要测距 因为上行链路只有一根纤,而且每一个ONU到OLT的距离是不一样的,虽然上行通过TDMA技术,让每一个ONU在不同的时间段发送数据,但是仍然有可能在同一时刻到达分光器,产生数据冲突。 有测距的信元传输 所以为了避免碰撞冲突,通过ONU在注册的时候就会启动测距…

四、VSCODE 使用GIT插件

VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git&#xff0c;就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …

RISC-V学习笔记

1.RISC ISA1个基本整数指令集多个可选的扩展指令集&#xff0c;如RV32I表示支持32位整数指令集。I表示基本指令集&#xff0c;M表示整数乘法与除法指令集&#xff0c;A表示存储器原子指令集&#xff0c;F表示单精度浮点指令集&#xff0c;D表示双精度浮点指令集等&#xff0c;C…

strapi中使用Documentation插件

Swagger UI 自动生成并展示了 API 的文档&#xff0c;这些文档是根据 OpenAPI Specification (OAS) 格式编写的。它提供了对 API 端点、请求方法&#xff08;GET, POST, PUT, DELETE 等&#xff09;、参数、响应格式等详细信息的描述 安装 npm run strapi install documentat…

AI来帮忙:蛋白纯化不用慌

在当今生物学研究的前沿领域&#xff0c;从探索疾病的发病机制&#xff0c;到新型药物的研发&#xff0c;再到生物工程产品的制造&#xff0c;高纯度、高活性的蛋白质都是不可或缺的基石。 科研人员在蛋白纯化的征程中&#xff0c;时常被诸多难题困扰。一方面&#xff0c;生物…

SpringCloud系列教程:微服务的未来(六)docker教程快速入门、常用命令

对于开发人员和运维工程师而言&#xff0c;掌握 Docker 的基本概念和常用命令是必不可少的。本篇文章将带你快速入门 Docker&#xff0c;并介绍一些最常用的命令&#xff0c;帮助你更高效地进行开发、测试和部署。 目录 前言 快速入门 docker安装 配置镜像加速 部署Mysql …

基于单片机中药存放环境监测系统的实现

基于单片机中药存放环境监测系统的实现 项目开发背景 随着现代中药的广泛应用&#xff0c;中药材的存储环境对其质量有着至关重要的影响。温湿度、烟雾、火灾等环境因素&#xff0c;若不加以控制&#xff0c;将会导致中药材失效或变质。因此&#xff0c;设计一个基于单片机的…

casaos安装最新版homeassistant-arm

进入cosOS界面点自定义安装 Docker镜像:homeassistant/armv7-homeassistant Tag:2024.12.2 标题&#xff1a;Home Assistant 图片路径&#xff1a;https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStoremain/Apps/HomeAssistant/icon.png Web UI&#xff1a;http&…

Fabric环境部署-安装Go

安装go语言环境 国内镜像&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 1.选择版本下载后解压&#xff1a;注意go1.11.linux-amd64.tar.gz换成你下的 sudo tar zxvf go1.21.linux-amd64.tar.gz -C /usr/local 2.. 创建Go目录 mkdir $HOME/go 3. 用vi打开~./bashrc&…