目录
云备份认识
实现目标
服务端工具类实现-文件实用工具类设计
服务端工具类实现- Json 实用工具类设计
服务端程序负责功能
服务端功能模块划分
系统配置信息
单例文件配置类设计
管理的数据信息
如何管理数据
数据管理类的设计
热点管理实现思路
热点管理类的设计
业务处理实现思路
网络通信接口设计
业务处理类设计
客户端程序负责功能
客户端功能模块划分
数据信息设计
文件操作实用类设计
数据管理类设计
文件备份类设计
项目总结
项目扩展
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);
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 *arry);
};
class JsonUtil{
public:
static bool Serialize(const Json::Value &root, std::string *str);
static bool UnSerialize(const std::string &str, Json::Value *root);
};
{
"hot_time" : 30,
"server_port" : 9090,
"server_ip" : "101.201.39.212",
"download_prefix" : "/download/",
"packfile_suffix" : ".lz",
"pack_dir" : "./packdir/",
"back_dir" : "./backdir/",
"backup_file" : "./cloud.dat"
}
使用单例模式管理系统配置信息,能够让配置信息的管理控制更加统一灵活。
#define CONFIG_FILE "./cloud.conf"
classConfig{
private:
time_t_hot_time;
int_server_port;
std::string_server_ip;
std::string_url_prefix;
std::string_arc_suffix;
std::string_pack_dir;
std::string_back_dir;
std::string_manager_file;//备份信息的配置管理
private:
staticstd::mutex_mutex;
staticConfig*_instance;
Config();
public:
boolReadConfig(conststd::string&filename); intGetHotTime();
intGetServerPort();
std::stringGetServerIp();
std::stringGetURLPrefix();
std::stringGetArcSuffix();
std::stringGetPackDir();
std::stringGetBackDir();
std::stringGetManagerFile(); public:
staticConfig*GetInstance();
};
typedefstructBackupInfo{
intpack_flag;
time_tmtime;
time_tatime;
size_tfsize;
std::stringrealpath;
std::stringurl;
std::stringpackpath;
boolNewBackupInfo(conststd::string&realpath);
}BackupInfo;
classDataManager{
private:
FileUtil_backup_file;
pthread_rwlock_t_rwlock;
std::unordered_map_table; public:
DataManager();
boolInitLoad();//初始化程序运行时从文件读取数据
boolStorage(); //每次有信息改变则需要持久化存储一次
boolInsert(conststd::string&key, constBackupInfo&val);
boolUpdate(conststd::string&key, constBackupInfo&val);
boolGetOneByURL(conststd::string&key, BackupInfo*info);
boolGetOneByRealPath(conststd::string&key, BackupInfo*info); boolGetAll(std::vector*arry);
};
//因为数据管理是要在多个模块中访问的,因此将其作为全局数据定义,在此处声明使用即可externDataManager*_data;
classHotManager{
private:
std::string_back_dir;
std::string_pack_dir;
std::string_arc_suffix;
std::string_url_prefix;
time_t_hot_time;
public:
HotManager();
boolHotJudge(conststd::string&file); boolRunModule();
};
POST/uploadHTTP/1.1
Content-Length:11
Content-Type:multipart/form-data;boundary= ----WebKitFormBoundary+16字节随机字符------WebKitFormBoundary
Content-Disposition:form-data;filename="a.txt";
hello world
------WebKitFormBoundary--
HTTP/1.1200 OK
Content-Length: 0
GET/listHTTP/1.1
Content-Length: 0
HTTP/1.1200 OK
Content-Length:
Content-Type: text/html
Page of Download
Download
a.txt
2023-8-13 03:00
27K
GET/download/a.txthttp/1.1
Content-Length: 0
HTTP/1.1200 OK
Content-Length: 100000
ETags: "filename-size-mtime一个能够唯一标识文件的数据"Accept-Ranges: bytes
GET/download/a.txthttp/1.1
Content-Length: 0
If-Range: "文件唯一标识"
Range: bytes=89-999
HTTP/1.1206 Partial Content
Content-Length:
Content-Range: bytes 89-999/100000
Content-Type: application/octet-stream
ETag: "inode-size-mtime一个能够唯一标识文件的数据"Accept-Ranges: bytes
//因为业务处理的回调函数没有传入参数的地方,因此无法直接访问外部的数据管理模块数据
//可以使用lamda表达式解决,但是所有的业务功能都要在一个函数内实现,于功能划分上模块不够清晰
//因此将数据管理模块的对象定义为全局数据,在这里声明一下,就可以在任意位置访问了
externcloud::DataManager*_data;
classService{
private:
int_server_port;
std::string_server_ip;
std::string_url_prefix;
httplib::Server_srv;
public:
staticvoidUpload(consthttplib::Request&req, httplib::Response&rsp);
staticvoidList(consthttplib::Request&req, httplib::Response&rsp);
staticvoidDownload(consthttplib::Request&req,httplib::Response&rsp);
public:
Service();
boolRunModule();
}
namespacefs=std::experimental::filesystem;
classFileUtil {
private:
std::string_name;
public:
FileUtil(conststd::string&name) :_name(name) {}
size_tFileSize();
time_tLastATime();
time_tLastMTime();
std::stringFileName();
boolGetPosLen(std::string*content, size_tpos, size_tlen); boolGetContent(std::string*content);
boolSetContent(conststd::string&content);
boolExists();
boolCreateDirectory();
boolScanDirectory(std::vector*arry);
};
classDataManager{
private:
std::unordered_map_table;
std::string_back_file;
public:
DataManager(conststd::stringback_file);
boolInitLoad();//程序运行时加载以前的数据
boolStorage();//持久化存储
boolInsert(conststd::string&key, conststd::string&val);
boolUpdate(conststd::string&key, conststd::string&val);
boolGetOneByKey(conststd::string&key, std::string*val);
};
#define SRV_IP "101.201.39.212"
#define SRV_PORT 9000
classBackUp {
private:
DataManager*_data;
std::string_back_dir;
std::string_back_file;
public:
BackUp(conststd::string&back_dir, conststd::string&back_file)
:_back_dir(back_dir)
, _back_file(back_file){}
std::stringGetFileIdentifier(conststd::string&filename);
boolUpload(conststd::string&filename);
boolIsCanBeUpload(conststd::string&filename);
boolRunModule();
};