web-dev-qa-db-fra.com

Comment rechercher des sous-dossiers et sous-sous-dossiers dans Google Drive?

Ceci est une question fréquemment posée.

Le scénario est le suivant: -

folderA____ folderA1____folderA1a
       \____folderA2____folderA2a
                    \___folderA2b

... et la question est de savoir comment répertorier tous les fichiers dans tous les dossiers sous la racine folderA.

16
pinoyyid

La première chose à comprendre est que dans Google Drive, les dossiers ne sont pas des dossiers!

Nous sommes tous habitués à l'idée de dossiers (aka répertoires) dans Windows/nix etc. Dans le monde réel, un dossier est un conteneur, dans lequel les documents sont placés. Il est également possible de placer des dossiers plus petits dans des dossiers plus grands. Ainsi, le grand dossier peut être considéré comme contenant tous les documents à l'intérieur de ses petits dossiers enfants.

Cependant, dans Google Drive, un dossier est PAS un conteneur, à tel point que dans la première version de Google Drive, ils n'étaient même pas appelés dossiers, ils s'appelaient Collections. Un dossier est simplement un fichier sans (a) aucun contenu et (b) un type mime spécial (application/vnd.google-apps.folder). La façon dont les dossiers sont utilisés est exactement de la même manière que les balises (aka labels) sont utilisées. La meilleure façon de comprendre cela est de considérer GMail. Si vous regardez en haut d'un élément de courrier ouvert, vous voyez deux icônes. Un dossier avec l'info-bulle "Déplacer vers" et une étiquette avec l'info-bulle "Étiquettes". Cliquez sur l'un ou l'autre et la même boîte de dialogue apparaît et concerne les étiquettes. Vos étiquettes sont répertoriées sur le côté gauche, dans une arborescence qui ressemble beaucoup à des dossiers. Surtout, un élément de courrier peut avoir plusieurs étiquettes, ou vous pourriez dire qu'un élément de courrier peut se trouver dans plusieurs dossiers. Les dossiers de Google Drive fonctionnent exactement de la même manière que les étiquettes GMail.

Après avoir établi qu'un dossier est simplement une étiquette, rien ne vous empêche d'organiser vos étiquettes dans une hiérarchie qui ressemble à une arborescence de dossiers, en fait, c'est la façon la plus courante de le faire.

Il devrait maintenant être clair qu'un fichier (appelons-le MyFile) dans folderA2b n'est PAS un enfant ou un petit-enfant de folderA. Il s'agit simplement d'un fichier avec une étiquette (appelée de manière confuse un parent) de "folderA2b".

OK, alors comment puis-je obtenir tous les fichiers "sous" le dossier A?

Alternative 1. Récursion

La tentation serait de lister les enfants du dossier A, pour tous les enfants qui sont des dossiers, lister récursivement leurs enfants, rincer, répéter. Dans un très petit nombre de cas, cela pourrait être la meilleure approche, mais pour la plupart, elle présente les problèmes suivants: -

  • Il est terriblement long de faire un aller-retour sur le serveur pour chaque sous-dossier. Cela dépend bien sûr de la taille de votre arbre, donc si vous pouvez garantir que la taille de votre arbre est petite, cela pourrait être OK.

Alternative 2. Le parent commun

Cela fonctionne mieux si tous les fichiers sont créés par votre application (c'est-à-dire que vous utilisez la portée drive.file). En plus de la hiérarchie de dossiers ci-dessus, créez un dossier parent factice appelé par exemple "MyAppCommonParent". Lorsque vous créez chaque fichier en tant qu'enfant de son dossier particulier, vous en faites également un enfant de MyAppCommonParent. Cela devient beaucoup plus intuitif si vous vous souvenez de considérer les dossiers comme des étiquettes. Vous pouvez désormais récupérer facilement tous les descendants en interrogeant simplement MyAppCommonParent in parents.

Alternative 3. Dossiers en premier

Commencez par récupérer tous les dossiers. Oui, tous. Une fois que vous les avez tous en mémoire, vous pouvez parcourir leurs propriétés parentales et créer votre arborescence et votre liste d'ID de dossier. Vous pouvez alors faire un seul files.list?q='folderA' in parents or 'folderA1' in parents or 'folderA1a' in parents.... En utilisant cette technique, vous pouvez tout obtenir en deux appels http.

Le pseudo-code de l'option 3 est un peu comme ...

// 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...

L'alternative 2 est la plus efficace, mais ne fonctionne que si vous avez le contrôle de la création de fichiers. La variante 3 est généralement plus efficace que la variante 1, mais il peut y avoir certaines petites tailles d'arbre où 1 est le meilleur.

23
pinoyyid