云备份——配置信息及获取配置信息类模块

news2025/1/23 7:18:56

一,配置信息

使用文件配置加载一些程序的运行关键信息,如ip,端口等,可以让程序的运行更加灵活

 我们需要的配置信息如下

  •  IP地址
  • 端口号
  • 热点判断时间,也就是非热点文件的时间要求
  • 文件下载的URL前缀路径,用于表示客户端请求是下载请求,避免查看请求和下载文件同名导致冲突
  • 压缩包后缀
  • 上传文件存放路径,文件上传后的存储位置
  • 非热点文件压缩包存放路径,非热点文件压缩后存储位置,注意不是压缩包(用户可能上传压缩包)
  • 服务端备份文件信息存储文件:服务器所有备份的文件的详细信息表存放的位置
{
    "server_ip" : "124.221.185.180",
    "server_port" : 8080,
    "hot_time" : 30,
    "url_prefix" : "/download/",
    "lz_prefix" : ".lz",
    "pack_dir" : "./packdir/",
    "back_dir" : "./backdir/",
    "manager_file" : "./files.dat"
}

配置文件的编写注完全遵照Json序列化,后续读取时进行反序列化即可

二,获取配置文件信息单例类

该类主要是一个单例设计模式,用于加载配置信息,并且对外提供获取对应配置信息的接口。

其主要实现接口如下

namespace mjw_cloud
{
    #define config_file "./cloud.conf"
    class Config
    {
        public:
        Config* GetInstance();
        time_t GetHotTime();
        int GetServerPort();
        std::string GetServerIp();
        std::string GetUrlPrefix();
        std::string GetLzPrefix();
        std::string GetPackDir();
        std::string GetBackDir();
        std::string GetManagerFile();
        
        private:
        bool GetConfig();//加载配置信息
        private:
        Config();
        Config(const Config& con);
        const Config& operator=(const Config& con);

        private:
        time_t _hot_time;//热点时间
        int _server_port;//服务器端口号
        std::string _server_ip;//服务器ip地址
        std::string _url_prefix;//url下载后缀
        std::string _lz_prefix;//非热点文件压缩后缀
        std::string _pack_dir;//下载文件路径
        std::string _back_dir;//压缩文件路径
        std::string _manager_file;//备份文件信息管理表文件
    };
}

代码实现如下

#define config_file "./cloud.conf"
    class Config
    {
    public:
        static Config &GetInstance()
        {
            // C++11 后利用局部静态变量特性实现单例可保证线程安全
            static Config _eton;
            return _eton;
        }
        time_t GetHotTime()
        {
            return _hot_time;
        }
        int GetServerPort()
        {
            return _server_port;
        }
        std::string GetServerIp()
        {
            return _server_ip;
        }
        std::string GetUrlPrefix()
        {
            return _url_prefix;
        }
        std::string GetLzPrefix()
        {
            return _lz_prefix;
        }
        std::string GetPackDir()
        {
            return _pack_dir;
        }
        std::string GetBackDir()
        {
            return _back_dir;
        }
        std::string GetManagerFile() 
        {
            return _manager_file;
        }
        private:
            bool GetConfig() // 加载配置信息
            {
                FileUtil fu(config_file);
                // 读取cloud.conf的序列化配置信息
                std::string conf;
                if (fu.GetContent(&conf) == false)
                {
                    std::cout << "get config failed" << std::endl;
                    return false;
                }
                Json::Value root;
                // 反序列化
                JsonUtil::UnSerialize(conf, &root);
                // 读取root内容
                _hot_time = root["hot_time"].asInt();            // 热点时间
                _server_port = root["server_port"].asInt();      // 服务器端口号
                _server_ip = root["server_ip"].asString();       // 服务器ip地址
                _url_prefix = root["url_prefix"].asString();     // url下载后缀
                _lz_prefix = root["lz_prefix"].asString();       // 非热点文件压缩后缀
                _pack_dir = root["pack_dir"].asString();         // 下载文件路径
                _back_dir = root["back_dir"].asString();         // 压缩文件路径
                _manager_file = root["manager_file"].asString(); // 备份文件信息管理表文件

                return true;
            }

        private:
            Config()
            {
                if (GetConfig() == false)
                {
                    std::cout << "read config failed" << std::endl;
                    abort();
                }
            }
            Config(const Config &con);
            const Config &operator=(const Config &con);

        private:
            time_t _hot_time;          // 热点时间
            int _server_port;          // 服务器端口号
            std::string _server_ip;    // 服务器ip地址
            std::string _url_prefix;   // url下载后缀
            std::string _lz_prefix;    // 非热点文件压缩后缀
            std::string _pack_dir;     // 下载文件路径
            std::string _back_dir;     // 压缩文件路径
            std::string _manager_file; // 备份文件信息管理表文件
        };

 测试用例

#include "util.hpp"
#include "config.hpp"
int main()
{   
    std::cout<<mjw_cloud::Config::GetInstance().GetHotTime()<<std::endl;
    std::cout<<mjw_cloud::Config::GetInstance().GetServerPort()<<std::endl;
    std::cout<<mjw_cloud::Config::GetInstance().GetServerIp()<<std::endl;
    std::cout<<mjw_cloud::Config::GetInstance().GetUrlPrefix()<<std::endl;
    std::cout<<mjw_cloud::Config::GetInstance().GetPackDir()<<std::endl;
    std::cout<<mjw_cloud::Config::GetInstance().GetBackDir()<<std::endl;
    std::cout<<mjw_cloud::Config::GetInstance().GetManagerFile()<<std::endl;


    return 0;
}

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

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

相关文章

Matlab图像处理-

对数变换 对数变换的一项主要应用是压缩动态范围。一些特别的图像在实际显示中&#xff0c;高灰度值部分较占优势&#xff0c;而低灰度值的可见细节部分丢失。通过计算对数&#xff0c;如10的动态范围会降至14左右[即 ln1013.8]&#xff0c;这样就更易于处理。 对数变换就是压…

Pygame中Trivia游戏解析6-4

3.3.3 显示题目选项 在显示题目选项时&#xff0c;有三种情况&#xff1a;分别是用户还未选择答案时&#xff1b;用户的答案是正确时&#xff1b;用户的答案是错误时。 &#xff08;1&#xff09;用户还未选择答案时 此时&#xff0c;用白色显示四个备选答案&#xff0c;如图…

数据工厂-生成接口通用用例

章节目录&#xff1a; 一、背景介绍二、前置准备三、设计思路四、代码具体实现五、执行效果六、其他说明七、结束语 一、背景介绍 有哪些用例是可以通用且固定的&#xff1f; 针对之前提到的接口用例设计思路&#xff0c;拆分为三个切入点&#xff1a; 举个例子&#xff1a; {…

【原创】H3C三层交换机VLAN路由

网络拓扑图 VLAN 配置 VLAN 100 VLAN 200 [H3C]int vlan 100 ip address 1.1.1.1 255.255.255.0[H3C-Vlan-interface100]int vlan 200 ip address 2.2.2.1 255.255.255.0[H3C]int GigabitEthernet 1/0/1port access vlan 100[H3C]int GigabitEthernet 1/0/2port access vlan 2…

R语言中缺失值的处理

目录 一.寻找缺失值 1.complete.cases() 2.manyNAs 二.缺失值的处理 1.直接删除 2.填补缺失值 一.寻找缺失值 1.complete.cases() #会展现缺失值 algae[!complete.cases(algae),] 2.manyNAs > manyNAs(algae) [1] 62 199 #表示第62条和第199条都有很多缺失值>m…

文本标注技术方案(NLP标注工具)

Doccano doccano 是一个面向人类的开源文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。您可以创建用于情感分析、命名实体识别、文本摘要等的标记数据。只需创建一个项目&#xff0c;上传数据&#xff0c;然后开始注释。您可以在数小时内构建数据集。 支持…

基于springboot跟redis实现的排行榜功能(实战)

概述 前段时间&#xff0c;做了一个世界杯竞猜积分排行榜。对世界杯64场球赛胜负平进行猜测&#xff0c;猜对1分&#xff0c;错误0分&#xff0c;一人一场只能猜一次。 1.展示前一百名列表。 2.展示个人排名(如&#xff1a;张三&#xff0c;您当前的排名106579)。 一.redis so…

wireshark抓包体验

目录 1、使用基础 1.1 数据包筛选 1.2 MAC地址筛选 1.3 端口筛选 1.4 协议筛选 1.5 包长度筛选 1.6 http请求筛选 2.数据包搜索 3.数据包还原 2、例题复现 1、使用基础 1.1 数据包筛选 ip.src 源ip地址 同理可以得到筛选目标地址&#xff1a; ip.dst 目的ip地址 1.2 …

Unity中Shader的渲染排序Tags{“Queue“ = “Transparent“}

文章目录 前言一、在Unity中渲染排序一般是固定的几个层级&#xff0c;透明 和 半透明是以 2500 为 分界点&#xff0c;渲染层级 从 低 到 高二、渲染队列 可以 在 SubShader 或 Pass 中写 前言 Unity中Shader的渲染排序 一、在Unity中渲染排序一般是固定的几个层级&#xff0…

【vue2第十章】data数据与组件间通信

组件化化开发时data写法。 组件化开发中data是一个函数&#xff0c;一个组件的data选项必须是一个函数。需要保证每个组件的实列维护自己的独立的数据。 写法就是&#xff1a; 函数名(){return{属性名:值,属性名:值,属性名:值} }这里不管实列化多少份这个组件&#xff0c;每个…

软件架构Architecture篇卷首语

2023年9月2日&#xff0c;周六晚上 我为什么要开始学习软件架构&#xff1f;我为什么要专门开始这个专栏&#xff1f; 原因如下&#xff1a; Well-structured software is delivered in half the time, at half the cost, with 8x less bugs ——US Air Force study 这句话是我…

2022年06月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:小白鼠再排队2 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白鼠可…

C++面试题(期)-数据库(二)

目录 1.3 事务 1.3.1 说一说你对数据库事务的了解 1.3.2 事务有哪几种类型&#xff0c;它们之间有什么区别&#xff1f; 1.3.3 MySQL的ACID特性分别是怎么实现的&#xff1f; 1.3.4 谈谈MySQL的事务隔离级别 1.3.5 MySQL的事务隔离级别是怎么实现的&#xff1f; 1.3.6 事…

TiDB同城双中心监控组件高可用方案

作者&#xff1a; Prest13 原文来源&#xff1a; https://tidb.net/blog/44b9b8b1 背景 在双中心部署tidb dr-auto sync集群&#xff0c;出于监控的高可用考虑&#xff0c;在物理分离的两个数据中心分别部署独立的prometheusalertmanagergrafana&#xff0c;实现任一监控均…

查询优化器内核剖析之查询的执行与计划的缓存 Hint 提示

本篇议题如下: 查询的执行与计划的缓存 Hint 提示 首先看到第一个议题 查询的执行与计划的缓存 一旦查询被优化之后&#xff0c;存储引擎就使用选中的执行计划将结果返回&#xff0c;而被使用的这个执行 计划就会被保存在内存中一个被称之为“计划缓存”的地方&#xff0c;从…

Leetcode 面试题 17.01 不用加号的加法

设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负数或 0结果不会溢出 32 位整数 我的答案&#xff1a; 一、信息 1.设计一个函数把两个数相加 2.不得使用或者其他运算符 3.a,b均为负数或…

代码随想录算法训练营第39天 | ● 62.不同路径 ● 63. 不同路径II

文章目录 前言一、62.不同路径二、63.不同路径II总结 前言 动态规划 一、62.不同路径 深搜动态规划数论 深搜&#xff1a; 注意题目中说机器人每次只能向下或者向右移动一步&#xff0c;那么其实机器人走过的路径可以抽象为一棵二叉树&#xff0c;而叶子节点就是终点&#…

Socket交互的基本流程?

TCP socket通信过程图 什么是网络编程&#xff0c;网络编程就是编写程序使两台连联网的计算机相互交换数据。怎么交换数据呢&#xff1f;操作系统提供了“套接字”&#xff08;socket&#xff09;的组件我们基于这个组件进行网络通信开发。tcp套接字工作流程都以“打电话”来生…

Opencv快速入门教程,Python计算机视觉基础

快速入门 OpenCV 是 Intel 开源计算机视觉库。它由一系列 C 函数和少量 C 类构成&#xff0c; 实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个 C 函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也 可以使用某些外部库。 OpenCV 对非…

Java开发环境---jdk下载与安装,配置环境变量及如何验证是否安装成功

1、jdk说明与介绍 1、JDK即Java Develop Kit&#xff0c;是Java开发工具包 2、JDK的基本组件包括&#xff1a; javac:编译器&#xff0c;将源程序转成字节码。jar:打包工具,将相关类文件打包成一个文件。javadoc&#xff1a;文档生成器&#xff0c;从源码注释中提取文档。jdb…