【问题标题】:Recursive search with Google Drive API使用 Google Drive API 进行递归搜索
【发布时间】:2015-11-03 23:25:40
【问题描述】:

我正在使用 Google Drive API v2。

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

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

感谢您的帮助。

【问题讨论】:

    标签: google-drive-api


    【解决方案1】:

    据我所知,children.list 和 files.list 都支持递归列表,所以我认为你必须按照你提到的那样实现它。 也许这种行为是由 Google 完成的,因为以前版本的 Drive(当时它仍被称为 Docs)允许文件位于多个“标签”中(有标签,还没有文件夹),保留该属性的剩余文件可能如果出现无限循环,则导致 kind

    【讨论】:

    • 这个答案表明 Docslist API 和 Drive API 具有不同的语义。不是这种情况。 Drive SDK 还支持多个父级,因此其行为类似于标签(删除时除外)。因此,原始问题有两种解决方案(1)做一个递归列表,(2)让所有后代都以祖父母为父母。
    • 我在哪里发现我们最多可以在一个查询中使用 20 个父母的问题。
    【解决方案2】:

    当您获得 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多