2013-03-01 2 views
4

Я работаю с API-интерфейсом Google Drive v2.Рекурсивный поиск с помощью API Google Диска

Я пытаюсь реализовать функцию поиска, используя ту, которая включена в API.

Похоже, что «children.list» не является рекурсивным, то есть он не просматривает все подпапки. Должен ли я реализовать его с помощью нескольких вызовов API, для каждой ссылки на дочерние ссылки в папке? Или я чего-то не хватает?

Благодарим за помощь.

ответ

0

Насколько я знаю, children.list или files.list поддерживают рекурсивный листинг, поэтому я думаю, вам придется реализовать это, как вы упомянули. Возможно, это поведение сделано Google, потому что предыдущая версия Диска (когда она все еще называлась Docs) позволяла файлам находиться в нескольких ярлыках (пока еще были ярлыки, а не папки), остальные файлы, хранящие это свойство может вызвать вид, если бесконечный цикл

+3

Этот ответ предполагает, что API-интерфейс Docslist и Drive API имеют разную семантику. Это не тот случай. SDK Drive также поддерживает несколько родителей и, таким образом, ведет себя как метки (кроме случаев, когда требуется удалить). Таким образом, существует два решения исходного вопроса (1): рекурсивный список, (2) имеют всех потомков, которые имеют дедушку и родителя. – pinoyyid

+0

Где я нахожу проблему, что мы можем использовать не более 20 родителей в запросе. –

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); 

} 
Смежные вопросы