我正在使用 Google Drive API v2。
我尝试使用 API 中包含的功能来实现搜索功能。
似乎“children.list”不是递归的,这意味着它不会查看所有子文件夹。对于每个文件夹子引用,我是否必须通过多次调用 API 来实现它?或者我在这里错过了什么?
谢谢你的帮助。
我正在使用 Google Drive API v2。
我尝试使用 API 中包含的功能来实现搜索功能。
似乎“children.list”不是递归的,这意味着它不会查看所有子文件夹。对于每个文件夹子引用,我是否必须通过多次调用 API 来实现它?或者我在这里错过了什么?
谢谢你的帮助。
据我所知,children.list 和 files.list 都支持递归列表,所以我认为你必须按照你提到的那样实现它。也许这种行为是由 Google 完成的,因为以前版本的 Drive(当时它仍被称为 Docs)允许文件位于多个“标签”中(有标签,还没有文件夹),保留该属性的剩余文件可能如果无限循环导致 kind
当您获得 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);
}