随着云存储服务的普及,越来越多的应用程序需要能够将文件保存或加载到云端。这里有一个仅包含头文件的库,它允许应用程序使用抽象接口与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。