Google drive api 如何在Google Drive中搜索子文件夹和子文件夹?

Google drive api 如何在Google Drive中搜索子文件夹和子文件夹?,google-drive-api,Google Drive Api,这是一个常见的问题 情况是:- folderA____ folderA1____folderA1a \____folderA2____folderA2a \___folderA2b 。。。问题是如何在根目录下列出所有文件夹中的所有文件folderA编辑:2020年4月谷歌宣布从2020年9月起禁用多父文件。这改变了下面的叙述,意味着选项2不再是选项。可以使用快捷方式实现选项2。我将在测试新限制/功能时进一步更新此答案 我们都习惯于在Wind

这是一个常见的问题

情况是:-

folderA____ folderA1____folderA1a
       \____folderA2____folderA2a
                    \___folderA2b

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

编辑:2020年4月谷歌宣布从2020年9月起禁用多父文件。这改变了下面的叙述,意味着选项2不再是选项。可以使用快捷方式实现选项2。我将在测试新限制/功能时进一步更新此答案 我们都习惯于在Windows/nix等系统中使用文件夹(又称目录)的概念。在现实世界中,文件夹是一个容器,文档放在其中。也可以将较小的文件夹放在较大的文件夹中。因此,可以将大文件夹视为包含其较小子文件夹中的所有文档

然而,在Google Drive中,文件夹不是容器,所以在Google Drive的第一个版本中,它们甚至不被称为文件夹,而是集合。文件夹只是一个文件,它(A)没有内容,(b)是一种特殊的mime类型(application/vnd.google apps.Folder)。文件夹的使用方式与标签(又名标签)的使用方式完全相同。理解这一点最好的办法是考虑Gmail。如果您查看打开的邮件项目的顶部,您会看到两个图标。带有工具提示“移动到”的文件夹和带有工具提示“标签”的标签。单击其中一个,将显示同一个对话框,该对话框与标签有关。标签列在左侧,在一个看起来很像文件夹的树显示中。重要的是,一个邮件项目可以有多个标签,或者说,一个邮件项目可以位于多个文件夹中。GoogleDrive文件夹的工作方式与GMail标签的工作方式完全相同

在确定文件夹只是一个标签之后,没有什么可以阻止您将标签组织在类似文件夹树的层次结构中,事实上这是最常见的方法

现在应该很清楚,folderA2b中的文件(我们称之为MyFile)不是folderA的子女或孙子。它只是一个标签为“folderA2b”的文件(混淆地称为父文件)。 好的,那么如何获取“folderA”下的所有文件?

备选方案1。递归

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

  • 为每个子文件夹执行服务器往返是非常耗时的。这当然取决于你的树的大小,所以如果你能保证你的树的大小是小的,那就可以了
备选案文2。共同的父母

如果所有文件都是由你的应用程序创建的(即,你使用的是drive.file scope),那么这种方法效果最好。与上面的文件夹层次结构一样,创建一个名为“MyAppCommonParent”的虚拟父文件夹。当您将每个文件创建为其特定文件夹的子文件时,也会将其设置为MyAppCommonParent的子文件。如果您记得将文件夹视为标签,这将变得更加直观。现在,只需在parents中查询
MyAppCommonParent
,即可轻松检索所有描述

备选方案3。文件夹优先

从获取所有文件夹开始。是的,都是。一旦将它们全部存储在内存中,您就可以通过它们的父属性进行爬网,并构建树结构和文件夹ID列表。然后,您可以执行单个
文件。列表?q='folderA'在家长中,或'folderA1'在家长中,或'folderA1a'在家长中…
。使用此技术,您可以在两个http调用中获取所有内容

选项3的伪代码有点像

//从驱动器文件中获取所有文件夹。list?q=mimetype=application/vnd.google-apps.folder和trashed=false&fields=parents,name//存储在地图中,由ID键入//查找folderA的条目并记下ID//查找ID位于父项中的任何条目,记下每个条目的ID/,递归重复//使用上面提到的所有ID构造…//files.list?q='folderA-ID'在家长中或'folderA1 ID'在家长中或'folderA1a ID'在家长中


备选方案2是最有效的,但只有在您可以控制文件创建的情况下才有效。备选方案3通常比备选方案1更有效,但可能存在某些较小的树大小,其中1是最佳的。

使用递归共享javascript解决方案以构建文件夹数组,从第一级文件夹开始,向下移动层次结构。该数组是通过递归循环遍历相关文件的父Id组成的

下面的摘录对gapi进行了3次单独的查询:

  • 获取根文件夹id
  • 获取文件夹列表
  • 获取文件列表
  • 代码遍历文件列表,然后创建文件夹名称数组

    const{google}=require('googleapis')
    const gOAuth=require(“./googleOAuth”)
    //解决获取G文件和文件夹的承诺
    const getgfilepath=async()=>{
    //更新以使用Promise.All()
    让gRootFolder=wait-getGfiles()。然后(结果=>{returnresult[2][0]['parents'][0]})
    让gFolders=wait-getGfiles()。然后(result=>{returnresult[1]})
    让gFiles=等待getGfiles()。然后(结果=>{return result[0]})
    //创建路径文件并使用文件夹路径数组创建一个新密钥,返回一个文件数组及其文件夹路径
    返回路径文件=gFiles
    .filter((文件)=>{return file.hasOwnProperty('parents')}
    .map((文件)=>({…文件,路径:makePathArray(gFolders,文件['parents'][0],gRootFolder)}))
    }
    //递归函数,用于构建文件路径数组top->bottom
    让马