使用 google drive rest 递归搜索文件

wor*_*red 4 google-drive-api

我正在尝试获取在父目录下创建的所有文件。父目录有很多子目录,然后是这些目录中的文件。

parent
--- sub folder1
    --- file1
    --- file2
Run Code Online (Sandbox Code Playgroud)

目前,我正在获取子文件夹的所有 id 并构建一个查询,例如q: 'subfolder1id' in parents 或 'subfolder2id' in parents以查找文件列表。然后我分批发出这些。如果我有 100 个文件夹,我会针对 10 个批量大小发出 10 个搜索查询。

有没有更好的方法来使用 google drive rest api 查询文件,它可以通过一个查询获得所有文件?

Mαπ*_*π.0 9

这是您的问题的答案

与您的场景相同的想法:

folderA____ folderA1____folderA1a
       \____folderA2____folderA2a
                    \___folderA2b
Run Code Online (Sandbox Code Playgroud)

我认为您可以从中获得 3 个替代答案。

备选方案 1. 递归

诱惑是列出文件夹 A 的子级,对于文件夹中的任何子级,递归列出它们的子级,冲洗,重复。在极少数情况下,这可能是最好的方法,但对于大多数情况,它存在以下问题:-

  • 为每个子文件夹执行服务器往返旅行非常耗时。这当然取决于你的树的大小,所以如果你能保证你的树大小很小,那就没问题了。

备选方案 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 调用中获得所有内容。

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

  • Google 现在在 Google Drive 中强制执行单亲,因此替代方案 2 将不再有效。https://developers.google.com/drive/api/v3/ref-single-parent (3认同)