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

文章目录

  • 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();
    };
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频

‌Groovy‌是一种基于Java虚拟机&#xff08;JVM&#xff09;的敏捷开发语言&#xff0c;结合了Python、Ruby和Smalltalk的许多强大特性。它旨在提高开发者的生产力&#xff0c;通过简洁、熟悉且易于学习的语法&#xff0c;Groovy能够与Java代码无缝集成&#xff0c;并提供强大…

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程-CSDN博客里面有提过相关知识------IO流&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…

【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

文献分享集:跨模态的最邻近查询RoarGraph

文章目录 1. \textbf{1. } 1. 导论 1.1. \textbf{1.1. } 1.1. 研究背景 1.2. \textbf{1.2. } 1.2. 本文的研究 1.3. \textbf{1.3. } 1.3. 有关工作 2. \textbf{2. } 2. 对 OOD \textbf{OOD} OOD负载的分析与验证 2.1. \textbf{2.1. } 2.1. 初步的背景及其验证 2.1.1. \textbf{2…

【读书笔记·VLSI电路设计方法解密】问题35:ASIC设计流程的两个主要方面是什么

毫无疑问,ASIC设计流程是一个复杂的系统,包含了许多商业CAD工具以及许多内部开发的工具或脚本。然而,无论流程中集成了多少工具或脚本,ASIC设计流程的核心目标始终可以归结为两个关键点:创建和检查。 创建过程指的是生成硬件的活动,例如RTL编码、逻辑综合以及布局布线。…

域上的多项式环,整除,相通,互质

例1.已知 (R,,x)为域&#xff0c;请选出正确的说法:(A)(R,,x)也是整区; ABCD (B)R中无零因子; C)R在x运算上满足第一、二、三指数律; (D)R只有平凡理想; (E)R只有平凡子环。 域的特征&#xff1a; 域中&#xff0c;非0元素的加法周期 思考、在模7整数环R,中&#xff0c;…

CSS3——3. 书写格式二

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写&#xff1a;--><!--1. 属性名:属性值--><!--2.属性值是对属性的相关描述--><!--3.属性名必须是…

2街景两两对比程序,Trueskill计算评分代码,训练模型,预测街景

目录 0、Emeditor软件1、place pluse 2.0数据集2、街景主观感知两两对比程序3、Trueskill结果4、训练模型Resnet&#xff0c;Efficient&#xff0c;VIT等对比选择。5、模型预测6、其他数据处理/程序/指导&#xff01;&#xff01;&#xff01;优势&#xff1a;全网最全最细&am…

【React+TypeScript+DeepSeek】穿越时空对话机

引言 在这个数字化的时代&#xff0c;历史学习常常给人一种距离感。教科书中的历史人物似乎永远停留在文字里&#xff0c;我们无法真正理解他们的思想和智慧。如何让这些伟大的历史人物"活"起来&#xff1f;如何让历史学习变得生动有趣&#xff1f;带着这些思考&…

Golang学习历程【第五篇 复合数据类型:数组切片】

Golang学习历程【第五篇 复合数据类型&#xff1a;数组&切片】 1. 数组&#xff08;Array&#xff09;1.1 数组的定义1.2 初始化数组1.3 数据的循环遍历1.4 多维数组 2. 切片&#xff08;Slice&#xff09;2.1 切片声明、初始化2.2 基于数组创建切片2.2 切片的长度(len)和容…

ESP32自动下载电路分享

下面是一个ESP32系列或者ESP8266等电路的一个自动下载电路 在ESP32等模块需要烧写程序的时候&#xff0c;需要通过将EN引脚更改为低电平并将IO0引脚设置为低电平来切换到烧写模式。 有时候也会采用先将IO接到一个按键上&#xff0c;按住按键拉低IO0的同时重新上电的方式进入烧写…

【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析

文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…

联发科MTK6771/MT6771安卓核心板规格参数介绍

MT6771&#xff0c;也被称为Helio P60&#xff0c;是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片&#xff0c;可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造&#xff0c;拥有八个ARM Cortex-A73和Cortex-A53核心&#xff0c;主频分别…

修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]

对于 iDevice 用户来说&#xff0c;只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道&#xff0c;iTunes 并不是一款高效的应用程序&#xff0c;有时性能会很差&#xff0c;例如在 iDevices 和计算机之间传输文件时不断…

【AI大模型】深入GPT-2模型细节:揭秘其卓越性能的秘密

目录 &#x1f354; GPT2的架构 &#x1f354; GPT2模型的细节 2.1 模型过程 2.2 GPT2工作细节探究 &#x1f354; 小结 学习目标 掌握GPT2的架构掌握GPT2的训练任务和模型细节 &#x1f354; GPT2的架构 从模型架构上看, GPT2并没有特别新颖的架构, 它和只带有解码器模块…

C语言 - 理解函数栈帧

一&#xff1a;概述 函数栈帧是函数调用过程中为管理和存储函数相关信息&#xff08;如局部变量、返回地址等&#xff09;而在栈上分配的一块内存区域。它是实现函数调用、递归和返回的关键机制。 二&#xff1a;栈帧的组成 一个典型的栈帧通常包含以下内容&#xff08;从高地…

windows终端conda activate命令行不显示环境名

问题&#xff1a; 始终不显示环境名 解决 首先需要配置conda的环境变量 确保conda --version能显示版本 然后对cmd进行初始化&#xff0c;如果用的是vscode中的终端&#xff0c;那需要对powershell进行初始化 Windows CMD conda init cmd.exeWindows PowerShell conda …

检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313 Github地址&#xff1a;https://github.com/CraftJarvis/RAT 想象一下&#xff0c;一个人工智能助手可以像莎士比亚一样写作&#xff0c;像专家一样推理。这听起来很了不起&#xff0c;对吧&#xff1f;但是&#xff0…

Fabric链码部署测试

参考链接&#xff1a;运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) &#xff08;2&#xff09;fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…

如何单独安装 MATLAB 工具箱

很多时候由于 MATLAB 太大而选择安装一些 Toolbox&#xff0c;但用着用着发现要用到某个没有安装的 Toolbox&#xff0c;这时候就需要再单独安装这个 Toolbox&#xff0c;下面提供两种方法。 本文以安装 系统辨识工具箱 System Identification Toolbox 为例。 方法一&#xf…