Google drive api 使用googledriveapi进行递归搜索

Google drive api 使用googledriveapi进行递归搜索,google-drive-api,Google Drive Api,我正在使用GoogleDriveAPIv2 我正在尝试使用API中包含的搜索功能实现一个搜索功能 “children.list”似乎不是递归的,这意味着它不会查看所有的子文件夹。 对于每个文件夹子引用,我是否必须通过多次调用API来实现它?还是我在这里遗漏了什么 谢谢您的帮助。据我所知,children.list和files.list都支持递归列表,因此我认为您必须按照您提到的那样实现它。 可能这一行为是由谷歌造成的,因为以前版本的驱动器(当时仍称为Docs)允许文件位于多个“标签”中(有标签,

我正在使用GoogleDriveAPIv2

我正在尝试使用API中包含的搜索功能实现一个搜索功能

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


谢谢您的帮助。

据我所知,children.list和files.list都支持递归列表,因此我认为您必须按照您提到的那样实现它。
可能这一行为是由谷歌造成的,因为以前版本的驱动器(当时仍称为Docs)允许文件位于多个“标签”中(有标签,但还没有文件夹),如果在获得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);

}
private void updateFolderOwner(字符串folderId,最终字符串newOwnerEmail)引发IOException{
字符串permissionId=service.permissions().getIdForEmail(newOwnerEmail.execute().getId();
Children.List请求=service.Children().List(folderId);
JsonBatchCallback callback=新的JsonBatchCallback(){
@凌驾
成功时公共无效(权限权限,HttpHeaders响应头){}
@凌驾
失败时公开作废(Google JSonerror e、HttpHeaders负责人){
System.out.println(“错误消息:+e.getMessage());
}
};
JsonBatchCallback findFolderCallback=新的JsonBatchCallback(){
@凌驾
public void onSuccess(文件、HttpHeaders和responseHeaders)引发IOException{
如果(文件!=null){
String fileExtension=file.getFileExtension();
字符串mimeType=file.getMimeType();
if(mimeType!=null&&mimeType.equals(“application/vnd.google apps.folder”)&&(fileExtension==null | | fileExtension.equals(“”)){
//递归搜索此文件夹。。。
updateFolderOwner(file.getId(),newOwnerEmail);
}
}
}
@凌驾
失败时公开作废(Google JSonerror e、HttpHeaders负责人){
System.out.println(“错误消息:+e.getMessage());
}
};
做{
试一试{
ChildList children=request.execute();
BatchRequestChangeOwnerBatch=service.batch();
BatchRequestFindFolderBatch=service.batch();
权限权限=新权限();
权限.setEmailAddress(newOwnerEmail);
permission.setValue(newOwnerEmail);
permission.setType(“用户”);
权限。设置角色(“所有者”);
for(ChildReference子项: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());
}捕获(IOE异常){
System.out.println(“发生错误:“+e”);
request.setPageToken(null);
}
}while(request.getPageToken()!=null&&request.getPageToken().length()>0);
}

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