文章目录
- 专栏导读
- 1.系统配置信息设计
- 2.系统配置信息实现
- 3.配置文件加载类设计(单例模式)
- 4.配置文件加载类实现与整理
专栏导读
🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。
🌸专栏简介:本文收录于 C++项目——云备份
🌸相关专栏推荐:C语言初阶系列、C语言进阶系列 、C++系列、数据结构与算法、Linux
🌸项目Gitee链接:https://gitee.com/li-yuanjiu/cloud-backup
1.系统配置信息设计
我们将程序运行中用到的一些关键信息保存到配置文件中,这样可以使程序的运行更加灵活。
这样做的好处是,未来如果我们想要修改一些关键信息,不需要去源文件里修改,避免了文件重新编译等
。
配置文件中包含以下配置信息:
-
热点判断时间
:决定热点文件隔多长时间会被判定为非热点文件; -
文件下载的url前缀路径
:用于表示客户端的请求是一个下载请求;- 例如当用户发来一个备份列表查看请求
listshow
,我们如何判断这个请求不是一个listshow
的文件下载请求。此时我们可以为下载请求添加一个前缀路径,例如/download/listshow
,那么就认为它是一个下载请求
。
- 例如当用户发来一个备份列表查看请求
-
压缩包后缀名
:约定一个压缩包命名规则,例如在原文件后面加上.lz表示该文件的压缩包名称; -
上传文件存放路径
:决定上传文件之后,该文件实际存储在服务器的何处; -
压缩包存放路径
:决定压缩后的文件存储在何处; -
服务端备份信息存放文件
:服务端记录的备份文件信息的持久化存储; -
服务器访问 IP 地址
; -
服务器访问端口
;
2.系统配置信息实现
// cloud.conf
{
"hot_time" : 30,
"server_port" : 9090,
"server_ip" : "0.0.0.0",
"download_prefix" : "/download/",
"packfile_suffix" : ".lz",
"pack_dir" : "./packdir/",
"back_dir" : "./backdir/",
"backup_file" : "./cloud.dat"
}
3.配置文件加载类设计(单例模式)
使用单例模式管理系统配置信息,能够让配置信息的管理控制更加统一灵活。该类的设计我们将使用单例模式中的懒汉模式
,即在使用时创建对象。
类中包含以下成员:
class Config
{
public:
static Config* GetInstance();
int _hot_time; // 热点判断时间
int _server_port; // 服务器访问端口
std::string _server_ip; // 服务器访问IP
std::string _download_prefix; // 文件下载前缀路径
std::string _packfile_suffix; // 压缩包后缀名
std::string _pack_dir; // 压缩包存放路径
std::string _back_dir; // 备份文件存放路径
std::string _backup_file; // 备份信息存放文件
private:
Config(); // 构造函数私有化
bool ReadConfigFile();
private:
int _hot_time;
int _server_port;
std::string _server_ip;
std::string _download_prefix;
std::string _packfile_suffix;
std::string _pack_dir;
std::string _back_dir;
std::string _backup_file;
static Config* _instance;
static std::mutex _mutex;
};
Config* Config::_instance = nullptr;
std::mutex Config::_mutex;
- 其中
Get
开头的成员函数用来获取私有成员的值; ReadConfigFile
:读取配置文件信息;
4.配置文件加载类实现与整理
#ifndef __MY_CONFIG__
#define __MY_CONFIG__
#include <mutex>
#include "util.hpp"
namespace cloud
{
#define CONFIG_FILE "./cloud.conf" // 配置文件路径
class Config
{
private:
Config() { ReadConfigFile(); }
static Config* _instance;
static std::mutex _mutex;
private:
int _hot_time; // 热点判断时间
int _server_port; // 服务器访问端口
std::string _server_ip; // 服务器访问IP
std::string _download_prefix; // 文件下载前缀路径
std::string _packfile_suffix; // 压缩包后缀名
std::string _pack_dir; // 压缩包存放路径
std::string _back_dir; // 备份文件存放路径
std::string _backup_file; // 备份信息存放文件
bool ReadConfigFile()
{
FileUtil fu(CONFIG_FILE);
std::string body;
if(fu.GetContent(&body) == false)
{
std::cout << "load config file failed!" << std::endl;
return false;
}
Json::Value root;
if(JsonUtil::Unserialize(body, &root) == false)
{
std::cout << "parse config file failed!" << std::endl;
return false;
}
_hot_time = root["hot_time"].asInt();
_server_port = root["server_port"].asInt();
_server_ip = root["server_ip"].asString();
_download_prefix = root["download_prefix"].asString();
_packfile_suffix = root["packfile_suffix"].asString();
_pack_dir = root["pack_dir"].asString();
_back_dir = root["back_dir"].asString();
_backup_file = root["backup_file"].asString();
}
public:
static Config* GetInstance()
{
if(_instance == nullptr)
{
_mutex.lock();
if(_instance == nullptr)
{
_instance = new Config();
}
_mutex.unlock();
}
return _instance;
}
int GetHotTime()
{
return _hot_time;
}
int GetServerPort()
{
return _server_port;
}
std::string GetSeverIp()
{
return _server_ip;
}
std::string GetDownloadPrefix()
{
return _download_prefix;
}
std::string GetPackFileSuffix()
{
return _packfile_suffix;
}
std::string GetPackDir()
{
return _pack_dir;
}
std::string GetBackDir()
{
return _back_dir;
}
std::string GetBackupFile()
{
return _backup_file;
}
};
Config* Config::_instance = nullptr;
std::mutex Config::_mutex;
}
#endif