21. 服务端工具类实现-文件实用工具类设计
不管是客户端还是服务端,文件的传输备份都涉及到文件的读写,包括数据管理信息的持久化也是如此,因此首先设计封装文件操作类,这个类封装完毕之后,则在任意模块中对文件进行操作时都将变的简单化。
/*util.hpp*/
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<std::string> *arry);
};
22. 服务端工具类实现-Json
实用工具类设计
/*util.hpp*/
class JsonUtil{
public:
static bool Serialize(const Json::Value &root, std::string *str);
static bool UnSerialize(const std::string &str, Json::Value *root);
};
23. 服务端配置信息模块实现-系统配置信息
使用文件配置加载一些程序的运行关键信息可以让程序的运行更加灵活。
配置信息:
- 热点判断时间
- 文件下载URL前缀路径
- 压缩包后缀名称
- 上传文件存放路径
- 压缩文件存放路径
- 服务端备份信息存放文件
- 服务器访问
IP
地址 - 服务器访问端口
{
"hot_time" : 30,
"server_port" : 9090,
"server_ip" : "192.168.122.136",
"url_prefix" : "/download/",
"arc_suffix" : ".lz",
"pack_dir" : "./packdir/",
"back_dir" : "./backdir/",
"manager_file" : "./back.dat"
}
23. 服务端配置信息模块实现-单例文件配置类设计
使用单例模式管理系统配置信息,能够让配置信息的管理控制更加统一灵活。
#define CONFIG_FILE "./cloud.conf"
class Config{
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:
static std::mutex _mutex;
static Config *_instance;
Config();
public:
bool ReadConfig(const std::string &filename);
int GetHotTime();
int GetServerPort();
std::string GetServerIp();
std::string GetURLPrefix();
std::string GetArcSuffix();
std::string GetPackDir();
std::string GetBackDir();
std::string GetManagerFile();
public:
static Config *GetInstance();
};
24. 服务端模块实现-管理的数据信息
- 文件实际存储路径
- 文件是否压缩标志
- 压缩包存储路径
- 文件访问URL
- 文件最后一次修改时间
- 文件最后一次访问时间
- 文件大小
25. 服务端数据管理模块实现-如何管理数据
- 内存中以文件访问URL为key,数据信息结构为val,使用哈希表进行管理,查询速度快。使用url作为key是因为往后客户端浏览器下载文件的时候总是以
url
作为请求。 - 采用文件形式对数据进行持久化存储(序列化方式采用
json
格式或者自定义方式)
26. 服务端数据管理模块实现-数据管理类的设计
/*data.hpp*/
typedef struct BackupInfo{
int pack_flag;
time_t mtime;
time_t atime;
size_t fsize;
std::string realpath;
std::string url;
std::string packpath;
bool NewBackupInfo(const std::string &realpath);
}BackupInfo;
class DataManager{
private:
FileUtil _backup_file;
pthread_rwlock_t _rwlock;
std::unordered_map<std::string, BackupInfo> _table;
public:
DataManager();
bool InitLoad();//初始化程序运行时从文件读取数据
bool Storage(); //每次有信息改变则需要持久化存储一次
bool Insert(const std::string &key, const BackupInfo &val);
bool Update(const std::string &key, const BackupInfo &val);
bool GetOneByURL(const std::string &key, BackupInfo *info);
bool GetOneByRealPath(const std::string &key, BackupInfo *info);
bool GetAll(std::vector<BackupInfo> *arry);
};
27. 服务端数据管理模块实现-数据管理类的测试验证
/*cloud.cpp*/
void DataTest();
int main()
{
return 0;
}