2013-03-01 79 views
4

我正在使用Google Drive API v2。使用Google Drive API进行递归搜索

我试图使用包含在API中的搜索功能来实现搜索功能。

看起来“children.list”不是递归的,这意味着它不会查看所有的子文件夹。 对于每个文件夹子引用,我是否必须通过多次调用API来实现它?或者我在这里错过了什么?

感谢您的帮助。

回答

0

据我所知,children.list和files.list支持递归列表,所以我认为你将不得不按照你所提到的来实现这个。 也许这种行为是由谷歌完成的,因为之前版本的云端硬盘(当它仍然被称为文档)允许文件位于多个“标签”(有标签,而不是文件夹),其余文件保存该属性如果无限循环可能导致种类

+3

此答案表明Docslist API和Drive API具有不同的语义。不是这种情况。 Drive SDK还支持多个父母,因此其行为与标签相似(除非涉及到删除)。因此,对于原始问题有两种解决方案(1)做递归列表,(2)让所有后代具有祖父母作为父母。 – pinoyyid 2013-07-15 14:38:02

+0

如果我发现问题,我们可以在查询中最多使用20个父母。 – 2015-03-09 07:21:33

0

当您获取ChildReferences的列表时,除非实际检索文件,否则无法确定它们是否为文件夹。所以如果你正在做一个大的递归搜索,你应该使用批处理来实现这一点。我创建了递归更改文件夹中所有文件的所有者的方法,这可能有所帮助:

private void updateFolderOwner(String folderId, final String newOwnerEmail) throws IOException{ 
    String permissionId = service.permissions().getIdForEmail(newOwnerEmail).execute().getId(); 

    Children.List request = service.children().list(folderId); 

    JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() { 
     @Override 
     public void onSuccess(Permission permission, HttpHeaders responseHeaders) {} 

     @Override 
     public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { 
      System.out.println("Error Message: " + e.getMessage()); 
     } 
    }; 

    JsonBatchCallback<File> findFolderCallback = new JsonBatchCallback<File>() { 
     @Override 
     public void onSuccess(File file, HttpHeaders responseHeaders) throws IOException { 
      if (file != null) { 
       String fileExtension = file.getFileExtension(); 
       String mimeType = file.getMimeType(); 
       if (mimeType != null && mimeType.equals("application/vnd.google-apps.folder") && (fileExtension == null || fileExtension.equals(""))) { 
        //Recursively search this folder... 
        updateFolderOwner(file.getId(),newOwnerEmail); 
       } 
      } 
     } 
     @Override 
     public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { 
      System.out.println("Error Message: " + e.getMessage()); 
     } 
    }; 

    do { 
     try { 
      ChildList children = request.execute(); 

      BatchRequest changeOwnerBatch = service.batch(); 
      BatchRequest findFolderBatch = service.batch(); 

      Permission permission = new Permission(); 
      permission.setEmailAddress(newOwnerEmail); 
      permission.setValue(newOwnerEmail); 
      permission.setType("user"); 
      permission.setRole("owner"); 

      for (ChildReference child : children.getItems()) { 
       service.files().get(child.getId()).queue(findFolderBatch, findFolderCallback); 
       service.permissions().update(child.getId(), permissionId, permission).setTransferOwnership(true).queue(changeOwnerBatch, callback); 
      } 
      changeOwnerBatch.execute(); 
      findFolderBatch.execute(); 

      request.setPageToken(children.getNextPageToken()); 
     } catch (IOException e) { 
      System.out.println("An error occurred: " + e); 
      request.setPageToken(null); 
     } 
    } while (request.getPageToken() != null && request.getPageToken().length() > 0); 

}