【问题标题】:In google drive API, is there a way to recursively looping over all the subfolders?在 google drive API 中,有没有办法递归循环所有子文件夹?
【发布时间】:2022-01-05 20:30:28
【问题描述】:

在 google drive API 中,有没有一种方法可以递归循环遍历所有子文件夹(它应该包括子文件夹、子文件夹的子文件夹等)。 另外,如果我碰巧找到所有文件夹 ID 并在这些文件夹中找到具有特定文件名的所有文件,那么什么是一个好的和正确的解决方案? -我已经尝试过“在父母中或”,但它不起作用。 -我知道我必须在 q 中使用 name =。

谢谢。

【问题讨论】:

  • 您能提供您当前的脚本吗?
  • 您用什么语言编写脚本?正如@DalmTo 所指,您应该只找到与q = parents in 'FolderID' 匹配的所有元素,其中mimeType = 'application/vnd.google-apps.folder'。此外,如果您想查找与特定名称匹配的所有文件,请使用q:name = 'nameFile'。您可以查看this了解更多信息。
  • 我用的是PHP,但应该只和API有关。如果我在 FolderId 中做父母,那么它会循环直接孩子,对吗?它将进入子文件夹的子文件夹/子文件夹。
  • 逻辑是,如果要使其递归,则每次检测到其中一个子文件夹为文件夹时,再次重复该过程,直到包含的文件都不是mimeType = 'application/vnd.google-apps.folder。你到底想用递归搜索来完成什么?

标签: google-drive-api


【解决方案1】:

问题是您真的不需要递归地执行此操作。你可以,但这意味着更多的请求。

如果您使用 nextpage 令牌执行标准 file.list,您将对驱动器帐户中的每 10000 个文件发出请求。将所有响应存储到应用程序中的单个变量中。然后在本地你可以对 parent 上的东西进行排序以找到文件夹并将它们整理出来。

这意味着一个初始请求,然后是对您云端硬盘帐户中每 10000 个文件的请求。因此,如果您的驱动器中有 15000 个文件,那么您正在查看对 api 的三个请求。

如果您真的想递归地执行此操作,如果您有一个包含超过 10000 个文件的目录,您将对系统中的每个目录以及任何下一页令牌请求 api。

因此,如果您有 25 个包含文件的文件夹。您正在查看至少 25 个对 api 的请求。

不久前我在C# 中进行了此操作,但它会占用您的配额。

 public static Google.Apis.Drive.v3.Data.FileList ListAll(DriveService service, FilesListOptionalParms optional = null)
        {
            try
            {
                // Initial validation.
                if (service == null)
                    throw new ArgumentNullException("service");

                // Building the initial request.
                var request = service.Files.List();

                // Applying optional parameters to the request.
                request = (FilesResource.ListRequest)SampleHelpers.ApplyOptionalParms(request, optional);

                var pageStreamer = new Google.Apis.Requests.PageStreamer<Google.Apis.Drive.v3.Data.File, FilesResource.ListRequest, Google.Apis.Drive.v3.Data.FileList, string>(
                                                   (req, token) => request.PageToken = token,
                                                   response => response.NextPageToken,
                                                   response => response.Files);

                var allFiles = new Google.Apis.Drive.v3.Data.FileList();
                allFiles.Files = new List<Google.Apis.Drive.v3.Data.File>();

                foreach (var result in pageStreamer.Fetch(request))
                {
                    allFiles.Files.Add(result);
                }

                return allFiles;
            }
            catch (Exception Ex)
            {
                throw new Exception("Request Files.List failed.", Ex);
            }
        }

提示

如果文件 mime 类型是 application/vnd.google-apps.file 它是一个文件夹。从中获取 id 并使用。

 q = parents in 'Id here'

【讨论】:

  • 感谢您的帮助。您的意思是先获取所有文件,然后从那里查找适用的数据吗?我不确定我是否正确遵循。那么它不会仍然需要相当多的带宽吗?另外,如果我在 'Id here' 和 mimeType = 'something' for 'q' 中做父母,那么它是否会查找具有 'Id' 本身的父文件夹的子文件夹?会不会只是去寻找孩子(只下一层)?谢谢!
  • 当我这样做时,我通常会在不使用 Q 的情况下获取所有文件。将所有数据存储在我系统中的单个变量中,然后当我完成后,我可以将其分类到文件夹中。如果您在每个文件夹和子文件夹之后使用 Q 进行搜索,那么您至少会请求每个文件夹和子文件夹。这将是更多的请求,然后是一个请求驱动器上的所有内容并使用下一页令牌的单个请求。
猜你喜欢
  • 2021-03-22
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多