欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我的项目--Automatic CloudBcakup

程序员文章站 2022-07-02 10:02:25
...

一、项目简介

Windows下的客户端对指定路径下的文件进行云备份到Linux下的服务器端,服务器端对非热点文件进行压缩存储,并且支持客户端在浏览器进行浏览或下载备份的文件,方便自动化管理重要文件。

二、整体流程框架

我的项目--Automatic CloudBcakup

我的项目--Automatic CloudBcakup

我的项目--Automatic CloudBcakup

三、使用的接口介绍

1、httplib基本使用:

#include "httplib.h"
static void HelloWorld(const httplib::Request &req, httplib::Response &rsp) 
{
    rsp.set_content("<html>hello world</html>","text/html");
    return;
}
int main() 
{
    httplib::Server srv;
    srv.set_base_dir("./www");
    srv.Get("/", HelloWorld);
    srv.listen("0.0.0.0", 9000);
}
/*g++ -std=c++0x test.cpp -o test -lpthread -lboost_filesystem -lboost_system*/

2、boost库:
boost库下载路径:点这里
boost库配置:点这里

3、zlib基本使用:

#include <iostream>
#include <fstream>
#include <string>
#include <zlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
bool Compress(const std::string &file) 
{
    std::string zip = file + ".gz";
    int f_fd = open(file.c_str(), O_RDONLY);
    if (f_fd < 0) 
    {
        return false;
    }   
    gzFile z_fp = gzopen(zip.c_str(), "wb");
    char buf[1024] = {0};
    int ret = 0;
    while((ret = read(f_fd, buf, 1024)) > 0) 
    {
        gzwrite(z_fp, buf, ret);
    }   
    close(f_fd);
    gzclose(z_fp);
    return true;
}
bool UnCompress(const std::string &file) 
{
    boost::filesystem::path path(file);
    std::string name = path.replace_extension("").string();
    gzFile zf = gzopen(file.c_str(), "rb");
    int fd = open(name.c_str(), O_CREAT|O_WRONLY|O_TRUNC, 0664);
    char buf[1024] = {0};
    int ret = 0;
    while((ret = gzread(zf, buf, 1024)) > 0) 
    {
        write(fd, buf, ret);
    
    close(fd);
    gzclose(zf);
    return true; 
 }
    int main()
{
    std::string file = "./test.text";
    std::string zip = "./test.text.zip";
    //Compress(file);
    UnCompress(zip);
    return 0; 
}
/*g++ test.cpp -lboost_filesystem -lboost_system -lz*/

四、服务端和客户端设计

1、服务端实现功能:

  • 提供解析基于https协议的put请求,将文件数据进行备份
  • 提供浏览器能够查看服务器上文件信息功能
  • 提供浏览器能够下载服务器上的文件功能
  • 提供对后台长时间无访问的文件进行压缩存储
class FileTool//文件读写模块
{
    public:
        static bool Read(const std::string& filename,std::string& body);//从文件读取所有内容
        static bool Write(const std::string& filename,const std::string& body);//向文件写入内容      
};

class CompressTool//文件压缩模块
{
    public:
        static bool Compress(const std::string& file_src,const std::string& file_det);//文件压缩
		static bool DeCompress(const std::string& file_src,const std::string& file_det);//文件解压缩          
};

class DataManage//数据管理模块
{
    private:
        std::string m_back_file;//持久化存储文件名称
        std::unordered_map<std::string,std::string> m_file_list;//数据管理容器
        pthread_rwlock_t m_rwlock;//读写锁
    public:
        DataManage(const std::string& file_path); 
        ~DataManage();         
        bool Exit(const std::string& filename);//判断文件是否存在       
        bool IsCompress(const std::string& filename);//判断文件是否已经压缩
        bool GetNoncompressList(std::vector<std::string>* list);//获取未压缩文件列表        
        bool GetGzName(const std::string&src,std::string& det);//通过源文件获取压缩包名称      
        bool Insert(const std::string& file_src,const std::string& file_det);//插入或更新数据          
        bool GetAllFileName(std::vector<std::string>* list);//获取所有文件名称
        bool InitLoad();//启动时从持久化存储文件中加载数据         
};

Cloud_Sys::DataManage data_manage(DATA_FILE);//实例化数据管理对象

class NonHotPotCompress//非热点文件监测模块
{
    private:
        std::string m_bu_dir;//压缩前的文件路径
        std::string m_gz_dir;//压缩后的文件路径
        bool IsHotPotFile(const std::string& filename)//判断文件是否为热点文件
    public:

        NonHotPotCompress(const std::string& bu_dir,const std::string& gz_dir);
        bool Start()//总体向外提供的功能接口,开始压缩模块
        
};

class Server//服务器模块
{
    private:
        std::string m_file_dir;//上传文件备份路径
        httplib::Server m_server;//实例化httplib库提供的Server对象,便于实现http协议

        static void FileUpLoad(const httplib::Request& req,httplib::Response& rsp);//文件上传处理回调函数    
        static void FileList(const httplib::Request& req,httplib::Response& rsp);//文件列表处理回调函数      
        static void FileDownLoad(const httplib::Request& req,httplib::Response& rsp);//文件下载处理回调函数       
    public:
        bool Start(); //主控流程   

};

其中服务器模块在客户端请求处理时:

//下载请求:
请求:GET /list/ HTTP/1.1 /(list/){0,1}
响应:HTTP/1.1 200 OK
 
//列表请求:
请求:GET /list/filename HTTP/1.1 /list/(.*)
响应:HTTP/1.1 200 OK

     Body
 
//上传请求:
请求:PUT /list/filename HTTP/1.1 /list/(.*)
Range: bytes=range_start-range_end
Content-Length: range_size
 
Body
响应:HTTP/1.1 200 OK

2、客户端实现功能:

  • 提供监控目录的功能,能够获取目录下文件信息,鉴别文件是否需要备份
  • 备份文件,基于文件的信息记录,便于文件是否需要备份的鉴别
  • HTTPS协议PUT请求,实现文件多线程分块上传功能
class FileTool   //文件读写模块
{
public:
	static bool Read(const std::string& filename, std::string& body);//从文件读取所有内容
	static bool Write(const std::string& filename, const std::string& body);//向文件写入内容
};


class DataManager  //文件信息管理模块
private:
		std::string m_store_file;//持久化存储信息管理的文件名称
		std::unordered_map<std::string, std::string> m_backup_list;//备份文件信息列表,key--文件名,val--etag
	
public:
	DataManager(const std::string& filename) :
		m_store_file(filename)
	{}
	bool Insert(const std::string& key, const std::string& val);//插入/更新信息
	bool GetEtag(const std::string& key, std::string& val);//通过文件名获取原有的etag信息
	bool Storage();//持久化存储所有文件信息
	bool InitLoad();//初始化加载原有文件信息
};


class CloudClient   //目录监控模块
{
private:
	std::string m_srv_ip;//服务端ip和port
	uint16_t m_srv_port;
	std::string m_listen_dir;//监控目录名称
	DataManager m_data_manage;//数据管理对象
public:
	CloudClient(const std::string& filename, const std::string& store_file
		,const std::string& srv_ip,const uint16_t& srv_port) :
		m_listen_dir(filename),
		m_data_manage(store_file),
		m_srv_ip(srv_ip),
		m_srv_port(srv_port)
	{}

	bool Start();//主控流程
	bool GetBackupFileList(std::vector<std::string>& list);//获取需要备份的文件列表
	bool GetEtag(const std::string& filename, std::string& etag);//计算文件的etag信息
};

五、代码实现

客户端
服务端

相关标签: C++ Linux 网络