一个基于 Google Docs 的备份应用程序






4.89/5 (71投票s)
一个用于将文档上传到您的 Google Docs 帐户的 C++ 客户端
引言
我想要编写一个小应用程序,允许将多个文件和文件夹拖放到一个容器中,以便将它们发送到在线存储。这篇文章是在 Google 推出 Google Drive 之前编写的,但它仍然可以方便地用于快速将多个文件上传到您的 Google Drive。
本文介绍如何开发这样一个应用程序,该应用程序将使用免费和付费的 GoogleDocs 服务在线存储文档和文件,允许最终用户拖放文件和整个文件夹,从而将选定的文件备份到预定义的 GoogleDocs 帐户。
Google Docs 允许用户创建和上传文档及文件,进行编辑,并将它们存储在线。该服务是免费的;但是,在使用付费服务时,存在一些限制。
Google Docs 帐户类型
如此处所述,免费帐户类型在允许上传的文件类型方面存在限制。这些限制适用于该服务的程序化使用,而不是通过在线界面(docs.google.com)使用。
要解除一些限制,最终用户应该拥有 Premier 帐户。免费帐户用户只能上传 HTML、PDF、Word、Excel、PowerPoint、OpenOffice、文本和图像。
实现
作为基础,我们开发了一个名为 SmartHTTP
的类库。
我们已经定义了
#define HTTP_POST_VERB L"POST"
#define HTTP_CONTENT_LENGTH L"Content-Length"
#define HTTP_CONTENT_TYPE L"Content-Type"
#define HTTP_MIME_BINARY L"application/octet-stream"
#define HTTP_MIME_FORM_URL_ENCODED L"application/x-www-form-urlencoded"
通过使用连接到 GoogleDocs 服务器
BOOL Connect(LPCTSTR szServerName, INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTP_PORT);
以及调用
if (!m_internet.Connect(GOOGLE_LOGIN_SERVER, INTERNET_DEFAULT_HTTPS_PORT))
SetWinInetError(m_internet.GetError());
else
{
//... here we upload the documents, etc.
Google Docs 服务器定义在此处
GOOGLE_LOGIN_SERVER is L”www.google.com”
您可能需要开设一个 Google 帐户。一个 GMail 帐户即可。如果您已登录,只需访问 http://docs.google.com。
基本上,我的应用程序是一个容器,可以将文件和整个文件夹拖放到其中,从而将其中所有文件(包括子文件夹中的文件)发送到 GoogleDocs 服务器。应用程序启动时,容器就会出现。
关闭它将把它发送到图标托盘。在运行时,应用程序的图标托盘用于显示状态消息。例如,当一个文件被拖到容器中时,它将被添加到队列中,并出现以下消息
关于转换为 Google Docs 格式
Google Docs 提供将上传的文档转换为 Google Docs 格式的选项。这种转换在此进行了说明。根据我的经验,某些类型的文档可能会在转换过程中损坏,特别是使用从右到左语言(阿拉伯语、希伯来语等)的 Word 文档。
因此,我添加了一个复选框,允许最终用户决定是否转换。
但在第一个文件被复制之前,会弹出“设置”对话框,允许最终用户输入 Google Docs 帐户详细信息。此外,还可以设置以下选项
- Google Apps Premier 帐户 - 允许指示帐户类型
- 镜像文件夹列表 - 允许添加(或删除)本地文件夹,这些文件夹将在服务器端进行镜像,保留给定路径下文件和文件夹的结构
- 在 Google Docs 中重新创建文件夹结构 - 启用此选项后,文档将复制到一个与本地文件夹同名的文件夹中
- 将所有文档上传到 Google Docs 根文件夹 - 启用此选项后,文档将复制到服务器端的根目录
- Windows 启动时启动程序 - 在 Windows 启动时启动 DocsOnline
Premier 帐户持有者可以复制更多类型的文件,这些文件对普通(免费)帐户有限制。
我的直观备份背后的逻辑
我认为应用程序和实用程序应该是直观且易于使用的。例如,我的应用程序允许拖放文件夹,通过这样做,所有文件以及所有子文件夹中的文件都会被备份,并且在检查服务器上已有的先前副本后进行。我用于这种“直观备份”的逻辑是通过检查每个文件并计算代表其内容的哈希值来实现的。此逻辑可处理以下场景
- 不同文件具有相同的名称 - 复制,但自动生成新名称。添加日志条目。
- 具有不同名称的相同文件 - 添加日志条目(在后续版本中,我们将把这些文件合并为一个具有单个名称的文件)。
- 具有相同名称的相同文件 - 跳过。
致谢
我在应用程序中使用的 Chris Maunder 的 SystemTraySDK 类
是对 Windows 系统托盘功能的轻量级封装。它会在系统托盘中添加一个图标,并带有指定的工具提示文本和回调通知值,该值会发送回父窗口。