【问题标题】:Google Drive API - get list of files including foldersGoogle Drive API - 获取包括文件夹在内的文件列表
【发布时间】:2015-12-04 09:25:58
【问题描述】:

我需要列出用户驱动器云中的所有图像。

我使用https://www.googleapis.com/drive/v2/files 和正确的过滤器来查询所有图像。我需要将我的应用程序中的结果分组到文件夹中。我知道一个文件可以有多个父级,这很好。

我想避免使用第一次调用的父 ID 通过https://developers.google.com/drive/v2/reference/files/get 进行调用(对每个文件进行一次调用)以获取文件夹。

是否有一种网络友好的方式来获取包含文件夹在内的所有文件?

编辑

一个简单的解决方案是在一个查询中获取所有具有 id 的文件夹,并在此结果中查找文件夹名称。也许这有可能?

【问题讨论】:

  • 我想你已经回答了你自己的问题。是的,这是可能的。
  • 目前正在测试,使用过滤器我只能获取文件夹并将它们放在地图中并递归查找文件夹父级并构建这样的路径......
  • 我个人会避免递归 - 它可以循环,因为不能保证文件夹形成层次结构。

标签: android google-drive-api google-drive-android-api


【解决方案1】:

正如您在上面的 cmets 中回答的那样(但您无法匹配名称,您必须匹配 ID;名称不是唯一的)。

第 1 步:一次性获取所有文件夹(分页结果、过滤不需要的字段、跳过已删除的字段):

  private static Drive mGOOSvc;
  ....
  static ArrayList<ContentValues> getFolders() {
    ArrayList<ContentValues> cvs = new ArrayList<>();
    if (mGOOSvc != null) try {
      Drive.Files.List qry = mGOOSvc.files().list()
        .setQ("mimeType = 'application/vnd.google-apps.folder'")
        .setFields("items(id,labels/trashed,parents/id,title),nextPageToken");
      String npTok = null;
      if (qry != null) do {
        FileList gLst = qry.execute();
        if (gLst != null) {
          for (File gFl : gLst.getItems()) {
            if (gFl.getLabels().getTrashed()) continue;
            for (ParentReference parent : gFl.getParents())
              cvs.add(newContentValues(gFl.getTitle(), gFl.getId(), parent.getId()));
          }
          npTok = gLst.getNextPageToken();
          qry.setPageToken(npTok);
        }
      } while (npTok != null && npTok.length() > 0);
    } catch (Exception e) { /* handle Exceptions */ }
    return cvs;
  }

第2步:解析生成的ArrayList构建树结构(匹配ParentIds,处理多个parents)

第 3 步:对 mime 类型为 ""image/jpeg", "image/png", ... "whatever img mimetype" 的文件执行相同操作(只需修改上面的代码即可文件)并再次解析。

当然,'execute()' 方法会产生应该按照here 指出的那样处理的异常。

...您可以采用“对网络不太友好”的方法来遍历文件夹树,如“testTree()”方法here 中所示。如果你不知道你的树结构有多深,递归是必要的。

祝你好运

【讨论】:

  • 很好的答案,但请记住 Google Drive 不是树形结构。这是一个网络。
  • 看起来像我所做的(我不使用 sdk,我使用 scribe 和直接 api 调用的直接 oauth 方法,因为我想包含许多网络并保持应用程序小) .谢谢,这也将对其他人有所帮助。由于我不是驱动器用户,因此我无法找出文件如何获得多个父级。我有可以存储文件的文件夹和移动文件的选项,但是没有什么可以让我将一个文件放入多个目录中,至少我找不到任何东西......但我现在也处理多个父母......顺便说一句,您也可以在检索文件之前过滤掉查询本身中的垃圾项
  • GooDrive 是一个网络模型。只是一堆带有指针的对象(没有任何东西指向文件,但是,只有文件夹被指向)。不同于经典操作系统。导致“不寻常”的场景,例如“当您删除具有多个父对象的对象时会发生什么?”,因为在drive.google.com(如在经典树中)中,您删除了在一个父对象下找到的一个实例......您只需要调整你的头。但是,很难将其转化为对非极客用户有意义的逻辑。
  • @prom85 "我不知道一个文件是如何获得多个父级的" 你的应用程序当然可以在“创建”或“补丁”中强制它。我认为drive.google.com 上的“复制”操作也可以,但不确定。可以在“Try It”here(页面底部)中进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多