国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

云備份客戶端——客戶端整體設計框架以及實用類工具實現

這篇具有很好參考價值的文章主要介紹了云備份客戶端——客戶端整體設計框架以及實用類工具實現。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?一,客戶端整體框架

客戶端要實現的功能和服務端相比相對簡單,客戶端要實現的功能是自動對指定文件中的文件進行備份,也就是定時對指定文件進行掃描,根據文件信息判斷文件,符合要求(新文件或者被修改過的文件)進行上傳

因此我們客戶端大概需要實現下面三個模塊

  • 數據管理模塊:管理備份文件的文件信息,后續(xù)需要通過該信息判斷文件是否上傳
  • 目錄遍歷模塊:定時遍歷指定文件下的所有文件
  • 文件備份模塊:遍歷文件時,根據文件信息判斷是否上傳

?開發(fā)環(huán)境

?由于我們客戶端大多是給windows用戶使用的,因此客戶端在Windows上用vs2019進行開發(fā)

二,實用工具類實現

客戶端的實用工具類的實現和服務端是一樣的,但是功能少了些,例如壓縮解壓縮,同時因為vs2019上按照Json庫不太方便,因此Json序列化和Json反序列化也不在使用,而在數據管理模塊中數據存儲時用到的序列化和反序列化,由我們自己完成。

#ifndef _MY_UTIL_
#define _MY_UTIL_
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <memory>
#include <sstream>
#include <experimental/filesystem>
#include <sys/stat.h>

namespace mjw_cloud
{
    namespace fs=std::experimental::filesystem;
    class FileUtil
    {
    public:
        FileUtil(const std::string &filename)
            : _filename(filename)
        {
        }
        // 獲取文件大小
        size_t FileSize()
        {
            struct stat st;
            if (stat(_filename.c_str(), &st) < 0)
            {
                std::cout << "get file attributes failed" << std::endl;
                return -1;
            }
            return st.st_size;
        }
        // 獲取文件最后一次修改時間&最后一次訪問時間
        time_t LastMTime()
        {
            struct stat st;
            if (stat(_filename.c_str(), &st) < 0)
            {
                std::cout << "get file attributes failed" << std::endl;
                return -1;
            }
            return st.st_mtime;
        }
        time_t LastATime()
        {
            struct stat st;
            if (stat(_filename.c_str(), &st) < 0)
            {
                std::cout << "get file attributes failed" << std::endl;
                return -1;
            }
            return st.st_atime;
        }
        // 獲取文件路徑名中的文件名
        //./abc/test.c ->test.c
        std::string FileName()
        {
            //這里由于時Windows下,因此目錄符號需要改變
            /*int pos = _filename.find_last_of("/");*/
            int pos = _filename.find_last_of("\\");
            if (pos < 0)
            {
                if(!_filename.empty()) return _filename;
                std::cout << "filename error" << std::endl;
                return nullptr;
            }
            return _filename.substr(pos + 1);
        }
        // 獲取文件指定位置指定長度字符串
        bool GetPosLen(std::string *body, size_t pos, size_t len)
        {
            std::ifstream ifs(_filename, std::ios::binary);
            if (ifs.is_open() == false)
            {
                std::cout << "open file failed" << std::endl;
                return false;
            }

            size_t size = this->FileSize();
            if (pos + len > size)
            {
                std::cout << "Get filecontent is be illegal" << std::endl;
                return false;
            }
            ifs.seekg(pos, ifs.beg);
            body->resize(size);
            ifs.read(&(*body)[0], len);
            if (ifs.good() == false)
            {
                std::cout << "read file failed" << std::endl;
                return false;
            }
            ifs.close();
            return true;
        }

        // 向文件寫入數據&向文件讀取數據
        bool SetContent(const std::string &body)
        {
            std::ofstream ofs(_filename, std::ios::binary);
            if (ofs.is_open() == false)
            {
                std::cout << "SetContent open file failed" << std::endl;
                return false;
            }

            ofs.write(&body[0], body.size());
            if (ofs.good() == false)
            {
                std::cout << "write file failed" << std::endl;
                return false;
            }
            ofs.close();
            return true;
        }

        bool GetContent(std::string *body)
        {
            size_t fsize = this->FileSize();
            return GetPosLen(body, 0, fsize);
        }

        // 判斷文件是否存在
        bool Exists()
        {
            struct stat sm;
            return stat(_filename.c_str(), &sm) == 0;
        }

        // 創(chuàng)建文件目錄&獲取文件目錄
        bool CreateDirectory()
        {
            if(Exists()) return true;
            return fs::create_directories(_filename);
        }
        bool ScanDirectory(std::vector<std::string>* arry)
        {
            CreateDirectory();
            for (auto &i : fs::directory_iterator(_filename))
            {
                if(fs::is_directory(i)==true)//如果文件是路徑名則跳過
                {
                    continue;
                }
                arry->push_back(fs::path(i).relative_path().string());
            }
            return true;
        }

        bool Remove()
        {
            if (Exists() == false)
            {
                std::cout << "object file unexist" << std::endl;
                return false;
            }
            remove(_filename.c_str());
            return true;
        }



    private:
        std::string _filename;
    };

}

#endif

?文章來源地址http://www.zghlxwxcb.cn/news/detail-698964.html

?

到了這里,關于云備份客戶端——客戶端整體設計框架以及實用類工具實現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • netty構建udp服務器以及發(fā)送報文到客戶端客戶端詳細案例

    netty構建udp服務器以及發(fā)送報文到客戶端客戶端詳細案例

    目錄 一、基于netty創(chuàng)建udp服務端以及對應通道設置關鍵 二、發(fā)送數據 三、netty中的ChannelOption常用參數說明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代碼中

    2024年04月09日
    瀏覽(30)
  • Redis的Java客戶端-Java客戶端以及SpringDataRedis的介紹與使用

    Redis的Java客戶端-Java客戶端以及SpringDataRedis的介紹與使用

    Spring Data Redis底層支持同時兼容Jedis和Lettuce兩種不同的Redis客戶端,可以根據需要任意選擇使用其中的一種。這樣既可以保留現有代碼使用的Jedis方式,也可以通過使用基于Netty的高性能Lettuce客戶端,提升應用的性能和吞吐量。 Jedis是一個傳統的Java Redis客戶端,使用BIO進行So

    2024年02月08日
    瀏覽(22)
  • 手機銀行客戶端框架之TMF框架介紹

    手機銀行客戶端框架之TMF框架介紹

    騰訊移動開發(fā)平臺(Tencent Mobile Framework)整合了騰訊在移動產品中開發(fā)、測試、發(fā)布和運營的技術能力,為企業(yè)提供一站式、覆蓋全生命周期的移動端技術平臺。核心服務包括移動客戶端開發(fā)組件、H5容器、灰度發(fā)布、熱更新、離線包、網關服務、消息推送、數據同步、移動

    2024年04月17日
    瀏覽(23)
  • WebRTC | 音視頻直播客戶端框架

    WebRTC | 音視頻直播客戶端框架

    ????????端到端通信互動技術可分解為以下幾個技術難點:客戶端技術、服務器技術、全球設備網絡適配技術和通信互動質量監(jiān)控與展示技術。 ????????音視頻直播可分成兩條技術路線:一條是以音視頻會議為代表的實時互動直播;另一條是以娛樂直播為代表的流媒體

    2024年02月14日
    瀏覽(26)
  • SVN客戶端安裝以及操作流程

    SVN客戶端安裝以及操作流程

    1:將客戶端安裝包和語言包放入本地電腦文件夾中 2:雙擊‘TortoiseSVN-1.14.1.29085-x64-svn-1.14.1.msi’進行安裝,這個比較簡單一直next即可 點擊“運行” 點擊“Next” ? ? 選擇SVN安裝路徑,點擊“Next” ? 點擊“Install” ? 點擊“Finish” ? 右擊電腦空白處,出現以下標志,則說明

    2024年02月14日
    瀏覽(21)
  • 因項目只做socket客戶端,不想用workerman或者swoole框架,簡單實現ws PHP客戶端

    docs/Client.md · master · mirrors / Textalk / websocket-php · GitCode

    2024年02月13日
    瀏覽(20)
  • Forest聲明式HTTP客戶端框架漫談

    Forest 是一款聲明式的 Java 開源 HTTP 框架,相比它的前輩 Httpclient 和 OkHttp 更簡明易懂、也更容易維護,使用過程中非常絲滑故想分享給更多的朋友,此處我們進行簡單的介紹和使用說明。 Forest為聲明式HTTP客戶端框架。將繁復的 HTTP 請求細節(jié)封裝成 Java 接口 + 注解的形式,不

    2024年02月09日
    瀏覽(24)
  • Java 網絡編程 —— 客戶端協議處理框架

    Java 對客戶程序的通信過程進行了抽象,提供了通用的協議處理框架,該框架封裝了 Socket,主要包括以下類: URL 類:統一資源定位符,表示客戶程序要訪問的遠程資源 URLConnection 類:表示客戶程序與遠程服務器的連接,客戶程序可以從 URLConnection 獲得數據輸入流和輸出流

    2024年02月07日
    瀏覽(31)
  • java socket Server TCP服務端向指定客戶端發(fā)送消息;可查看、斷開指定連接的客戶端;以及設置客戶端最大可連接數量。

    首先需要知道java里如何創(chuàng)建一個Socket服務器端。 提示:注意server.accept()方法調用會阻塞,只有新的客戶端連接后才返回一個新的socket對象。如果一直未連接那么會一直處于阻塞狀態(tài) 了解了如何創(chuàng)建一個socket服務器端后。那么如何實現給指定的連接客戶端發(fā)送消息呢?首先我

    2024年02月11日
    瀏覽(24)
  • 雙線網絡發(fā)布服務器以及客戶端上網介紹

    實驗要求: 1、公司想將自己的服務器雙線發(fā)布出去。 2、員工可以訪問電信和網通的WEB服務器。 配置思路: 1、事先指明公司和電信網通路由器的NAT的內部和外部端口。配置NAT路由器的默認路由。 2、實現公網網絡互通。 3、公司配置: 配置訪問控制列表 access-list 100 permit

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包