文章目录
- 10. 客户端工具类
- 10.1 整体的类
- 10.2 测试
- 11 客户端数据管理类
- 11.1 整体的类
- 11.2 测试
- 12. 客户端业务处理
- 12.1 整体的类
完整的代码–gitee链接
10. 客户端工具类
10.1 整体的类
在windows平台下进行开发,Util.hpp
实际上是客户端FileUtil.hpp
和JsonUtil.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;
}
输出如下
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;
}
输出如下
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();
};
}