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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (71投票s)

2012 年 1 月 25 日

CPOL

4分钟阅读

viewsIcon

107680

downloadIcon

3951

一个用于将文档上传到您的 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

319435/File_shown_in_GoogleDocs.jpg

基本上,我的应用程序是一个容器,可以将文件和整个文件夹拖放到其中,从而将其中所有文件(包括子文件夹中的文件)发送到 GoogleDocs 服务器。应用程序启动时,容器就会出现。

319435/DocsOnline1.jpg

关闭它将把它发送到图标托盘。在运行时,应用程序的图标托盘用于显示状态消息。例如,当一个文件被拖到容器中时,它将被添加到队列中,并出现以下消息

319435/DocsOnline3.jpg

关于转换为 Google Docs 格式

Google Docs 提供将上传的文档转换为 Google Docs 格式的选项。这种转换在此进行了说明。根据我的经验,某些类型的文档可能会在转换过程中损坏,特别是使用从右到左语言(阿拉伯语、希伯来语等)的 Word 文档。

因此,我添加了一个复选框,允许最终用户决定是否转换。

但在第一个文件被复制之前,会弹出“设置”对话框,允许最终用户输入 Google Docs 帐户详细信息。此外,还可以设置以下选项

  • Google Apps Premier 帐户 - 允许指示帐户类型
  • 镜像文件夹列表 - 允许添加(或删除)本地文件夹,这些文件夹将在服务器端进行镜像,保留给定路径下文件和文件夹的结构
  • 在 Google Docs 中重新创建文件夹结构 - 启用此选项后,文档将复制到一个与本地文件夹同名的文件夹中
  • 将所有文档上传到 Google Docs 根文件夹 - 启用此选项后,文档将复制到服务器端的根目录
  • Windows 启动时启动程序 - 在 Windows 启动时启动 DocsOnline

319435/DocsOnline2.jpg

Premier 帐户持有者可以复制更多类型的文件,这些文件对普通(免费)帐户有限制。

我的直观备份背后的逻辑

我认为应用程序和实用程序应该是直观且易于使用的。例如,我的应用程序允许拖放文件夹,通过这样做,所有文件以及所有子文件夹中的文件都会被备份,并且在检查服务器上已有的先前副本后进行。我用于这种“直观备份”的逻辑是通过检查每个文件并计算代表其内容的哈希值来实现的。此逻辑可处理以下场景

  1. 不同文件具有相同的名称 - 复制,但自动生成新名称。添加日志条目。
  2. 具有不同名称的相同文件 - 添加日志条目(在后续版本中,我们将把这些文件合并为一个具有单个名称的文件)。
  3. 具有相同名称的相同文件 - 跳过。

致谢

我在应用程序中使用的 Chris MaunderSystemTraySDK 类是对 Windows 系统托盘功能的轻量级封装。它会在系统托盘中添加一个图标,并带有指定的工具提示文本和回调通知值,该值会发送回父窗口。

© . All rights reserved.