RGF:一个具有云功能的保存/打开对话框





5.00/5 (7投票s)
用新的云 API 替换 GetOpenFileName/GetSaveFileName!
引言
如今,云存储的可用性前所未有,许多应用程序都希望能够将文件加载或保存到云端。这是一个头文件库,允许应用程序使用抽象接口,在保存/打开文件时与Google Drive、OneDrive和DropBox进行交互。它提供两个 GUI 版本,一个是 UWP(适用于 Windows 10 1903+),另一个是非 UWP 版本。
这是带 UWP 的界面
这是不带 UWP 的界面
快速设置
该库使用了我的REST库、我的GOD库、我的UWPLib库、我的XML库、我的RKEY库以及我的AX库,所有这些都组合在一个单一的头文件中。
- 包含 rgf1.hpp 来使用该库
- 对于 UWP 界面,包含 rgf2.hpp(以及 1.manifest)
- 对于非 UWP 界面,包含 rgf3.hpp 和 .rc 文件。
RGB::RGBF s;
s.google.tokens.resize(3);
s.google.id = "...";
s.google.secret = "...";
s.google.tokens[0] = "... access token ...";
s.google.tokens[1] = "... refresh token ...";
// Same for s.onedrive and s.db
您必须为要使用的任何平台创建一个应用程序。所有三个都使用 OAUTH2
进行身份验证。如果您不传递访问令牌,系统将要求用户登录。默认情况下,这将在外部浏览器(您的默认浏览器)中完成,但您可以修改 RunUrl
函数以使用我自己的 AX 接口,该接口会打开一个 IWebBrowser
控件。请注意,IWebBrowser2
可能与最新的 HTML 功能不兼容,因此建议使用默认的外部浏览器。您的重定向 URL 默认监听在端口 9932 上。
- 对于 OneDrive,您必须在此处创建“统一应用程序”此处,或在此处创建新的 Azure 应用此处。
- 对于 Google Drive,您可以在此处创建一个新的 Google Cloud Platform 应用程序此处。
- 对于 DropBox,您可以在此处创建一个新应用此处。
RGBF 结构
struct RGBF
{
int func = 0; // 0 save, 1 load
HWND hParent = 0;
bool NoBrowserKey = false;
HRESULT rs = E_ABORT;
GOD::ystring resultFile;
GOD::ystring DefExt;
std::vector<wchar_t> Filter;
std::shared_ptr<RGF::GOD::GOOGLEDRIVE> goo = 0;
std::shared_ptr<RGF::GOD::ONEDRIVE> one = 0;
std::shared_ptr<RGF::GOD::DROPBOX> drop = 0;
AUTH google;
AUTH onedrive;
AUTH db;
std::wstring Title;
// Saving
DWORD sz = 0;
const char* d = nullptr;
std::function<HRESULT(char*, size_t)> cbf = nullptr;
// Opening
std::vector<char>* read = 0;
// For Old style only
HWND hH = 0;
bool InProgress = false;
bool ShouldCancelProp = false;
};
打开文件
RGF::RGBF s;
std::vector<char> r;
s.read = &r;
HRESULT rv = RGF::Open(s); // Uses the UWP Interface
HRESULT rv = RGF::Open2(s); // Uses the old Interface
成功时(rv == S_*
),传入的 vector 将填充已打开文件的数据,无论它是本地文件还是远程文件。与通用对话框不同,RGF 将为您加载文件到提供的 vector 中。如果您不提供 vector,则只会返回文件名(或云中的 ID)。
保存文件
RGF::RGBF s;
s.d = d.data();
s.sz = (DWORD)d.size();
s.resultFile = L"r:\\1.dat"; // for default local saving
s.DefExt = L"dat"; // added automatically to remote files as well
HRESULT rv = RGF::Save(s); // Uses the UWP Interface
HRESULT rv = RGF::Save2(s); // Uses the old Interface
在此函数中,您需要提前提供要保存的数据。
示例项目
包含了一个示例项目(VS 2019),该项目将凭据/令牌保存/加载到 XML 文件中。您可以使用 #define USE_UWP instdfx.h
来使用 UWP 界面。
BAR (备份存档器) 项目
我一直想创建自己的存档器。这是一个简单的开源工具,它使用压缩 API进行压缩,使用远程差分压缩来高效创建增量/差分备份,并且还使用 RGF 将它们上传到云存储。所有这些都在多线程环境中使用我的多核工具完成。它的名字是 BAR (Backup ARchiver)。
BAR 存档使用带标签、可扩展的格式。每个标签包含一个头信息和标签的大小。目前定义了三个标签
- 标题
- 项目信息(属性、名称、时间、CRC 等)
- 项目数据
项目数据包含项目的存储数据。它可以是
- 未压缩
- 文件的签名,供以后在增量备份中使用
- 使用压缩 API 中定义的某种方法进行压缩(默认是
COMPRESS_ALGORITHM_LZMS
) - 基于先前备份的差分数据
- 链接到另一个文件(如果存储重复文件)
所有签名信息都放在实际压缩数据之前,这使得该工具可以在存储远程文件时仅下载文件开头部分,并且能够在不需要完整备份的情况下创建增量备份。
它可以选择性地加密数据(它使用 SHA-2 哈希提供的密码,并使用 AES-256 进行加密)。
命令行
BAR <command> <options> <files>
备份存档器命令
a - Create new archive or update archive
d - Delete files
e - Extract archive
ee - Extract from an archive folder (main archive and differential updates)
l - List archive contents
ll - List archive contents (csv)
m - Merge archives
s - Generate signature for archive
t - Test archive
tt - Test from an archive folder (main archive and differential updates)
u - Differentially update archive
uu - Differentially update archive (backup to folder)
z - Separate archive to signatures only
备份存档器开关
-i <mask> - Include files
-p <pwd> - Set password
-r - Recurse subdirectories
-o - Overwrite archive if it exists before adding files
-s - Generate signatures
-t - Test run
-y - Yes to all questions
-x - Exclude files
--ir - Include files with regexp
--dup - On duplicate files found, don't store them again, just link them.
--xr - Exclude files with regexp
--rgf <f> - Specify file for OneDrive/GoogleDrive/DropBox
-- keep <dir> - Keep an archive uploaded with uu to a local folder
-- incr <d> - Add incremental backup to "u" command.
--threads<n> - Use n threads (if not specified, it gets 2* available CPUs).
大多数开关可以与许多命令(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 状态的增量信息(基于 target1
和 target2
)的存档。如果没有变化,将不会创建任何内容。
本地增量备份到本地文件夹
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。
您也可以手动使用“e
”提取增量备份,例如,如果您有 backup1.bar 和 backup2.bar,在提取第一个文件后提取第二个文件将生成增量恢复。
待实现(尚未)
- 存在一个 UWP bug,它阻止在
TextBox
中输入文本,目前请使用粘贴功能。 - DropBox 在非 UWP 模式下尚不能正常工作。
- DropBox 退出功能尚不能正常工作。
历史
- 2019 年 6 月 2 日:包含 BAR
- 2019 年 6 月 1 日:首次发布