使用Google Drive API进行递归搜索

时间:2013-03-01 02:00:51

标签: google-drive-api

我正在使用Google Drive API v2。

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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);

}
相关问题