从 Google 驱动器中提取文件层次结构 Java

Extract File Hierarchy from Google Drive in Java

我需要从 Google 驱动器读取文件夹、子文件夹和文件,并在我的文件系统中创建相应的层次结构(文件夹、子文件夹和文件),文件为空(我只想保留名称,而不是文件的数据)。就像我下载了所有内容,但只有空文件,而不必下载整个文件。

我的目标是在本地拥有完整的层次结构,以便与使用文件系统(文件夹、子文件夹和文件)作为输入的其他程序一起使用。

我的问题是 Google 驱动器 API 似乎是基于 ID(标签)并且似乎没有 hierarchy/path。我要么列出所有文件并找到那些有父级的文件,然后自己创建整个层次结构(这似乎不是一个好主意),要么从根文件开始并使用 com.google.api.services.drive.Drive.Children 递归创建我的文件夹和文件来自以根为父的文件(我对那个有问题,因为我似乎找不到它的 Maven 依赖项)。

您有更好的主意吗?或者您是否知道是否已有解决方案?我似乎无法在 Google Drive 文档中找到与此相关的任何内容(并且这些示例几乎从来没有正确的 Maven 依赖项)。

谢谢你的宝贵时间。

示例: 在 Google 驱动器

file1.parent is folder1
file2.parent is root
folder1.parent is root

在本地文件系统上应该这样显示(它可能在临时文件夹中)。

root/
    folder1/
        file1
    file2

不要递归调用云端硬盘。

实现您想要的效果的最佳方法是使用 files.list q=mimetype=application/vnd.google-apps.folder 获取所有文件夹,然后使用每个文件夹的 parent 信息构建一个 in-memory 层次结构。

请记住,Google 驱动器不强制执行层次结构,因此一个文件可以有多个 parent,一个 grandparent 也可以是一个 child .

例如

folderA_
folderB_\  
         \__folderC
                   \__folderB

...是合法的

您可能需要考虑使用可用范围,例如请求完整的驱动器范围,因为您需要与列出或重新组织用户驱动器中的文件相关,如 Choose Auth Scopes

中所述

请求格式:

(https://www.googleapis.com/auth/drive)

另一方面,您也可以通过发送带有 Files: list 中给出的所有适用参数的 HTTP 请求来检索文件列表。

java 的快速入门指南 - https://developers.google.com/drive/v3/web/quickstart/java

他们使用 gradle。如果您更喜欢 maven,请使用以下依赖项:

<dependencies>
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-drive</artifactId>
        <version>v3-rev22-1.21.0</version>
    </dependency>

    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client</artifactId>
        <version>1.21.0</version>
    </dependency>

    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client-jetty</artifactId>
        <version>1.21.0</version>
    </dependency>

</dependencies>

这将为您提供工作示例(我花了 10 分钟 运行)。现在让我们来看看层次结构问题。您必须使用 files.list 方法并指定搜索查询。支持的查询参数列表在这里 - https://developers.google.com/drive/v3/web/search-parameters.

所以,你从根开始,像这样:

    FileList result = service.files().list()
            .setQ("'root' in parents and trashed = false")
            .setPageSize(100)
            .setFields("nextPageToken, files(id, name, mimeType)")
            .execute();

然后在查询中使用文件夹 ID 而不是 'root' 递归构建层次结构。您可以通过查看其 mimeType 属性 来判断给定文件资源是文件夹还是文件 - 文件夹的 mime 类型是 application/vnd.google-apps.folder.