2017-01-19 42 views
3

这是一个常见问题。如何在Google云端硬盘中搜索子文件夹和子子文件夹?

的情况是: -

folderA____ folderA1____folderA1a 
     \____folderA2____folderA2a 
        \___folderA2b 

...,问题是我怎么列出根folderA下的所有文件夹中的所有文件。

+0

[如何获取Google云端硬盘API文件夹列表]的可能副本(http://stackoverflow.com/questions/24720075/how-to-get-list-of-files-by-folder-on -google-drive-api) – DaImTo

+0

我同意有很多这样的问题我认为你应该将你的答案添加到现有的问题中,而不是打开一个新的问题并回答它。这里是另一个http://stackoverflow.com/q/11400669/1841839 – DaImTo

+0

和另一个。 http://stackoverflow.com/q/20923329/1841839 – DaImTo

回答

5

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

我们都习惯于在Windows/nix等文件夹(又名目录)的想法。在现实世界中,文件夹是一个容器,其中放置文档。也可以在较大的文件夹中放置较小的文件夹。因此,大文件夹可以被认为是包含其较小的子文件夹内的所有文件。

但是,在Google云端硬盘中,一个文件夹是而不是是一个容器,因此在Google云端硬盘的第一个版本中,它们甚至不被称为文件夹,它们被称为集合。文件夹只是一个文件,其中包含(a)没有内容,以及(b)特殊的MIME类型(application/vnd.google-apps.folder)。使用文件夹的方式与完全相同,即使用标签(也称为标签)的方式。理解这个最好的方法是考虑GMail。如果您查看打开的邮件项目的顶部,您会看到两个图标。工具提示“移至”的文件夹和工具提示“标签”的标签。点击其中任何一个,出现相同的对话框,全部是关于标签。您的标签在左侧列出,树形显示器看起来很像文件夹。重要的是,一个邮件项目可以有多个标签,或者你可以说,一个邮件项目可以在多个文件夹中。 Google云端硬盘文件夹的工作方式与GMail标签的工作方式完全相同。

确定文件夹只是一个标签后,没有什么能够阻止您在类似于文件夹树的层次结构中组织标签,实际上这是最常见的方式。

现在应该清楚folderA2b中的文件(我们称之为MyFile)不是folderA的子孙或孙子。它只是一个带有“folderA2b”标签(令人困惑地称为父项)的文件。

好的,那么如何获取“folderA下的所有文件?

替代1.递归

的诱惑将是列出folderA的孩子,对于那些文件有任何孩子,递归地列出自己的孩子,漂洗,重复。在极少数情况下,这可能是最好的办法,但对于大多数人来说,有以下问题: -

  • 这是可悲的耗时器为每个子文件夹服务器往返。这当然取决于你的树的大小,所以如果你可以保证你的树大小很小,那可以。

替代2.公共父

如果所有的文件都被你的应用程序创建(即您使用drive.file范围)效果最好。除上述文件夹层次结构外,还创建一个名为say“MyAppCommonParent”的虚拟父文件夹。当您将每个文件创建为其特定文件夹的子文件夹时,您还将它作为MyAppCommonParent的子文件夹。如果您记得将文件夹视为标签,这会变得更加直观。您现在可以通过简单地查询MyAppCommonParent in parents轻松检索所有的descdendants。

替代3.文件夹第一

开始通过让所有的文件夹。是的,所有这些。将所有内容都存储起来之后,您就可以抓取父项属性并构建树结构和文件夹ID列表。然后你可以做一个files.list?q='folderA' in parents or 'folderA1' in parents or 'folderA1a' in parents...。使用这种技术,您可以在两个http调用中获取所有内容。

方案2是最有效率的,但只有在您控制了文件创建时才有效。替代方案3通常比替代方案1更有效,但是可能存在某些小的树尺寸,其中1是最好的。

+1

谢谢你。能够在两个通话中完成它将是理想的,但是如何在一次通话中获取树中的所有文件夹?似乎需要使用递归方法来获取树中的所有文件夹,以构建树中所有文件的单个调用的聚合“父母”查询。情况并非如此吗? – Rodzilla

+0

同样会很高兴看到一些代码与第3步关联的最佳做法 –

相关问题