Когда вы получаете список 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);
}
Этот ответ предполагает, что API-интерфейс Docslist и Drive API имеют разную семантику. Это не тот случай. SDK Drive также поддерживает несколько родителей и, таким образом, ведет себя как метки (кроме случаев, когда требуется удалить). Таким образом, существует два решения исходного вопроса (1): рекурсивный список, (2) имеют всех потомков, которые имеют дедушку и родителя. – pinoyyid
Где я нахожу проблему, что мы можем использовать не более 20 родителей в запросе. –