google-drive-api

google drive api - ¿Cómo busco subcarpetas y subcarpetas en Google Drive?



google-drive-api (1)

Esta es una pregunta frecuente.

El escenario es: -

folderA____ folderA1____folderA1a /____folderA2____folderA2a /___folderA2b

... y la pregunta es cómo enumero todos los archivos en todas las carpetas en la folderA raíz folderA


¡Lo primero que hay que entender es que en Google Drive, las carpetas no son carpetas!

Todos estamos acostumbrados a la idea de carpetas (también conocidos como directorios) en Windows / nix, etc. En el mundo real, una carpeta es un contenedor en el que se colocan los documentos. También es posible colocar carpetas más pequeñas dentro de carpetas más grandes. Por lo tanto, se puede pensar que la carpeta grande contiene todos los documentos dentro de sus carpetas secundarias más pequeñas.

Sin embargo, en Google Drive, una Carpeta NO es un contenedor, tanto es así que en la primera versión de Google Drive, ni siquiera se llamaron Carpetas, se llamaron Colecciones. Una carpeta es simplemente un archivo con (a) sin contenido y (b) un tipo MIME especial (application / vnd.google-apps.folder). La forma en que se usan las carpetas es exactamente la misma forma en que se usan las etiquetas (también conocidas como etiquetas). La mejor manera de entender esto es considerar GMail. Si observa la parte superior de un elemento de correo abierto, verá dos iconos. Una carpeta con la información sobre herramientas "Mover a" y una etiqueta con la información sobre herramientas "Etiquetas". Haga clic en cualquiera de estos y aparecerá el mismo cuadro de diálogo que trata sobre las etiquetas. Sus etiquetas se enumeran en el lado izquierdo, en una pantalla de árbol que se parece mucho a las carpetas. Es importante destacar que un elemento de correo puede tener varias etiquetas, o podría decir que un elemento de correo puede estar en varias carpetas. Las carpetas de Google Drive funcionan exactamente de la misma manera que funcionan las etiquetas de GMail.

Habiendo establecido que una Carpeta es simplemente una etiqueta, no hay nada que le impida organizar sus etiquetas en una jerarquía que se asemeje a un árbol de carpetas, de hecho, esta es la forma más común de hacerlo.

Ahora debería quedar claro que un archivo (llamémoslo MyFile) en la carpeta A2b NO es hijo o nieto de la carpeta A. Es simplemente un archivo con una etiqueta (confusamente llamada Parent) de "folderA2b".

Bien, entonces, ¿cómo obtengo todos los archivos "debajo" de la carpeta A?

Alternativa 1. Recursión

La tentación sería enumerar los elementos secundarios de la carpeta A, para cualquier elemento secundario que sea una carpeta, enumere recursivamente a sus elementos secundarios, enjuague y repita. En un número muy pequeño de casos, este podría ser el mejor enfoque, pero para la mayoría, tiene los siguientes problemas:

  • Lamentablemente, lleva mucho tiempo hacer un viaje de ida y vuelta del servidor para cada subcarpeta. Por supuesto, esto depende del tamaño de su árbol, por lo que si puede garantizar que el tamaño de su árbol es pequeño, podría estar bien.

Alternativa 2. El padre común

Esto funciona mejor si todos los archivos están siendo creados por su aplicación (es decir, si está utilizando el alcance de drive.file). Además de la jerarquía de carpetas anterior, cree una carpeta principal ficticia llamada say "MyAppCommonParent". A medida que crea cada archivo como hijo de su Carpeta particular, también lo hace hijo de MyAppCommonParent. Esto se vuelve mucho más intuitivo si recuerda pensar en las Carpetas como etiquetas. Ahora puede recuperar fácilmente todos los descendientes simplemente consultando MyAppCommonParent in parents .

Alternativa 3. Carpetas primero

Comience por obtener todas las carpetas. Sí, todos ellos. Una vez que los tenga todos en la memoria, puede rastrear las propiedades de sus padres y construir la estructura de árbol y la lista de ID de carpetas. A continuación, puede hacer una sola files.list?q=''folderA'' in parents or ''folderA1'' in parents or ''folderA1a'' in parents... Con esta técnica, puede obtener todo en dos llamadas http.

El pseudocódigo para la opción 3 es un poco como ...

// get all folders from Drive files.list?q=mimetype=application/vnd.google-apps.folder and trashed=false&fields=parents,name // store in a Map, keyed by ID // find the entry for folderA and note the ID // find any entries where the ID is in the parents, note their IDs // for each such entry, repeat recursively // use all of the IDs noted above to construct a ... // files.list?q=''folderA-ID'' in parents or ''folderA1-ID'' in parents or ''folderA1a-ID'' in parents...

La alternativa 2 es la más eficaz, pero solo funciona si tienes control de la creación de archivos. La alternativa 3 es generalmente más eficiente que la alternativa 1, pero puede haber ciertos tamaños de árboles pequeños donde 1 es mejor.