65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2019 年 6 月 1 日

CPOL

5分钟阅读

viewsIcon

11374

用新的云 API 替换 GetOpenFileName/GetSaveFileName!

引言

如今,云存储的可用性前所未有,许多应用程序都希望能够将文件加载或保存到云端。这是一个头文件库,允许应用程序使用抽象接口,在保存/打开文件时与Google Drive、OneDriveDropBox进行交互。它提供两个 GUI 版本,一个是 UWP(适用于 Windows 10 1903+),另一个是非 UWP 版本。

这是带 UWP 的界面

这是不带 UWP 的界面

快速设置

该库使用了我的REST库、我的GOD库、我的UWPLib库、我的XML库、我的RKEY库以及我的AX库,所有这些都组合在一个单一的头文件中。

  1. 包含 rgf1.hpp 来使用该库
  2. 对于 UWP 界面,包含 rgf2.hpp(以及 1.manifest
  3. 对于非 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.bartarget2.bar 是使用 -s 选项创建的,这将创建一个包含当前 c:\mytools 状态的增量信息(基于 target1target2)的存档。如果没有变化,将不会创建任何内容。

本地增量备份到本地文件夹

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.barbackup2.bar,在提取第一个文件后提取第二个文件将生成增量恢复。

待实现(尚未)

  • 存在一个 UWP bug,它阻止在 TextBox 中输入文本,目前请使用粘贴功能。
  • DropBox 在非 UWP 模式下尚不能正常工作。
  • DropBox 退出功能尚不能正常工作。

历史

  • 2019 年 6 月 2 日:包含 BAR
  • 2019 年 6 月 1 日:首次发布
© . All rights reserved.