随着云存储服务的普及,越来越多的应用程序需要能够将文件保存或加载到云端。这里有一个仅包含头文件的库,它允许应用程序使用抽象接口与Google Drive、OneDrive和DropBox进行交互,以保存或打开文件。该库提供了两种GUI版本,一种带有UWP(适用于Windows 10 1903+),另一种不带UWP。
该库使用REST、GOD、UWPLib、XML、RKEY和AX库,所有这些都结合在一个单一的头文件系统中。
对于UWP接口,包含rgf2.hpp(以及1.manifest);对于非UWP接口,包含rgf3.hpp和.rc文件。
以下是一些C++代码示例,展示了如何使用该库。
        RGB::RGBF s;
        s.google.tokens.resize(3);
        s.google.id = "..."; // Google Drive ID
        s.google.secret = "..."; // Google Drive Secret
        s.google.tokens[0] = "... access token ..."; // Google Drive Access Token
        s.google.tokens[1] = "... refresh token ..."; // Google Drive Refresh Token
        // 对于OneDrive和DropBox也是类似的设置
    
需要为任何平台创建应用程序。这三个平台都使用OAUTH2进行认证。如果没有传递访问令牌,用户将被要求登录。默认情况下,这是在外部浏览器中完成的,但可以更改RunUrl函数,使用AX接口打开IWebBrowser控件。
对于OneDrive,需要在这里创建一个“Converged Application”,或者在这里创建一个新的Azure应用程序。对于Google Drive,需要在这里创建一个新的应用程序。对于DropBox,需要在这里创建一个新的应用程序。
以下是RGBF结构的定义:
        struct RGBF {
            int func = 0; // 0保存,1加载
            HWND hParent = 0;
            bool NoBrowserKey = false;
            HRESULT rs = E_ABORT;
            GOD::ystring resultFile;
            GOD::ystring DefExt;
            std::vector Filter;
            std::shared_ptr goo = 0;
            std::shared_ptr one = 0;
            std::shared_ptr drop = 0;
            AUTH google;
            AUTH onedrive;
            AUTH db;
            std::wstring Title;
            // 保存
            DWORD sz = 0;
            const char* d = nullptr;
            std::function cbf = nullptr;
            // 打开
            std::vector* read = 0;
            // 仅用于旧风格
            HWND hH = 0;
            bool InProgress = false;
            bool ShouldCancelProp = false;
        };
          
以下是使用库打开文件的C++代码示例:
        RGF::RGBF s;
        std::vector r;
        s.read = &r
        HRESULT rv = RGF::Open(s); // 使用UWP接口
        HRESULT rv = RGF::Open2(s); // 使用旧接口
     
在成功的情况下(rv == S_*),传递的向量将被填充打开的文件的数据,无论是本地文件还是远程文件。与常见的对话框不同,RGF会为加载文件到提供的向量中。如果没有提供一个向量,那么只有文件名(或ID,如果是在云端)将被返回。
以下是使用库保存文件的C++代码示例:
        RGF::RGBF s;
        s.d = d.data();
        s.sz = (DWORD)d.size();
        s.resultFile = L"r:\\1.dat"; // 默认本地保存
        s.DefExt = L"dat"; // 也会自动添加到远程文件
        HRESULT rv = RGF::Save(s); // 使用UWP接口
        HRESULT rv = RGF::Save2(s); // 使用旧接口
    
在这个函数中,需要提前提供要保存的数据。
包含一个示例项目(VS 2019),它保存/加载XML文件中的凭据/令牌。可以通过#define USE_UWP instdfx.h来使用UWP接口。
一直想创建自己的归档器。这里是一个简单的开源工具,它使用Compression API进行压缩,使用Remote Differential Compression高效创建增量/差异备份,并且使用RGF将它们上传到云存储。所有这些都在多线程环境中使用多核工具完成。该工具名为BAR(Backup Archiver)。
BAR归档使用标记的、可扩展的格式。每个标记包含一个头部和标记的大小。目前定义了三个标记:
它可以可选地加密数据(它使用SHA-2对提供的密码进行哈希,并使用AES-256进行加密)。
BAR
备份归档器命令:
备份归档器开关:
大多数开关可以与许多命令(a、e、d等)一起使用。
        BAR a target.bar -r -s --dup -x *.exe -x *.lib -x *.dll -p 12345678 c:\mytools
    
这将创建一个没有exe/lib文件的归档,带有签名(稍后可以用于增量备份),并带有密码12345678。
        BAR l target.bar
        BAR ll target.bar
    
以普通形式或CSV列出归档内容。
        BAR d target.bar *.dat
    
这将从归档中删除所有".dat"文件。
        BAR t target.bar
        BAR e target.bar c:\r
    
这将测试或将归档提取到c:\r。
        BAR u target3.bar --incr target1.bar --incr target2.bar -r -s ... c:\mytools
    
假设target1.bar和target2.bar是使用-s选项创建的,这将创建一个包含当前状态的c:\mytools的增量信息的归档。如果没有变化,将不会创建任何内容。
        BAR uu c:\backups -r -s ... c:\mytools
    
假设c:\backups包含其他完整/增量备份,这将创建c:\mytools的备份。如果没有备份,将创建完整备份。如果存在完整备份,将创建该备份的增量备份。
        BAR uu onedrive:BACKUPS\MYTOOLS --rgf 1.xml -r -s ... c:\mytools
    
假设1.xml包含onedrive的客户端/秘密/访问令牌(格式是RGF库使用的格式),这将创建c:\mytools的备份并将其上传到onedrive。如果没有备份,将创建完整备份。如果存在备份,将创建该备份的增量备份。
由于BAR格式在开头存储了签名,BAR不需要从服务器下载完整的完整备份,就可以生成差异备份。
        BAR ee c:\mybackups c:\r
        BAR ee onedrive:BACKUPS\ --rgf 1.xml c:\r
    
这将提取所有备份到c:\r。