如何在Google云端硬盘中搜索子文件夹和子文件夹?

问题描述 投票:15回答:1

这是一个常见问题。

方案是:-

folderA____ folderA1____folderA1a
       \____folderA2____folderA2a
                    \___folderA2b

...问题是如何列出根目录folderA下所有文件夹中的所有文件。

google-drive-api
1个回答
32
投票
编辑:2020年4月,Google已宣布从2020年9月起禁用多父文件。这将更改下面的叙述,意味着选项2不再是选项。可能可以使用快捷方式实现选项2。当我测试新的限制/功能时,我将进一步更新此答案

首先要了解的是,在Google云端硬盘中,文件夹不是文件夹!

我们都习惯于Windows / nix等中的文件夹(也称为目录)的概念。在现实世界中,文件夹是一个用来放置文档的容器。也可以将较小的文件夹放在较大的文件夹内。因此,可以将大文件夹视为在其较小的子文件夹中包含所有文档。

但是,在Google云端硬盘中,文件夹是

NOT

容器,以至于在Google云端硬盘的第一个发行版中,它们甚至都没有被称为文件夹,它们被称为集合。文件夹只是一个文件,其中(a)没有内容,并且(b)是特殊的mime类型(application / vnd.google-apps.folder)。文件夹的使用方式

完全与标签(也称为标签)的使用方式相同。理解这一点的最好方法是考虑使用GMail。如果查看打开的邮件项目的顶部,则会看到两个图标。工具提示为“ Move to”的文件夹,工具提示为“ Labels”的标签。单击其中任何一个,将显示相同的对话框,并且全部关于标签。您的标签在树状显示(类似于文件夹)的左下方列出。重要的是,一个邮件项目可以具有多个标签,或者可以说一个邮件项目可以位于多个文件夹中。 Google云端硬盘的文件夹的工作方式与GMail标签的工作方式完全相同。

已经确定文件夹只是一个标签,没有什么可以阻止您在类似于文件夹树的层次结构中组织标签,实际上,这是最常用的方法。现在应该很清楚,文件夹A2b中的文件(我们称其为MyFile)不是文件夹A的子级或子级。它只是一个带有“ folderA2b”标签(易称为“父级”)的文件。

好,如何获得所有在“ A文件夹下的文件?

替代1.递归

诱惑是列出folderA的子代,对于所有属于文件夹的子代,递归地列出其子代,冲洗,重复。在极少数情况下,这可能是最好的方法,但是对于大多数情况,它存在以下问题:-

为每个子文件夹进行服务器往返很费时间。当然,这确实取决于树的大小,因此,如果可以保证树的大小很小,就可以了。

  • 替代2.公共父母

    如果所有文件都由您的应用创建(即,您正在使用drive.file范围),则效果最佳。以及上面的文件夹层次结构,创建一个名为“ MyAppCommonParent”的虚拟父文件夹。在将每个文件作为其特定文件夹的子级创建时,还使它成为MyAppCommonParent的子级。如果您记得将文件夹视为标签,这将变得更加直观。现在,您只需查询MyAppCommonParent in parents即可轻松检索所有后代。

    替代3.文件夹优先

首先获取所有文件夹。是的,所有人。将它们全部保存在内存中后,您可以爬网它们的父级属性,并构建树结构和文件夹ID列表。然后,您可以执行一个files.list?q='folderA' in parents or 'folderA1' in parents or 'folderA1a' in parents...。使用此技术,您可以通过两个http调用获取所有内容。

选项3的伪代码有点像...

// get all folders from Drive files.list?q=mimetype=application/vnd.google-apps.folder and trashed=false&fields=parents,name // store in a Map, keyed by ID // find the entry for folderA and note the ID // find any entries where the ID is in the parents, note their IDs // for each such entry, repeat recursively // use all of the IDs noted above to construct a ... // files.list?q='folderA-ID' in parents or 'folderA1-ID' in parents or 'folderA1a-ID' in parents...

替代2效率最高,但仅在您可以控制文件创建时才有效。替代方案3通常比替代方案1更有效,但是可能有一些小树,其中1最好。

© www.soinside.com 2019 - 2024. All rights reserved.