2017-01-19 2 views
3

Dies ist eine häufig gestellte Frage.Wie durchsuche ich Unterordner und Unterunterordner in Google Drive?

Das Szenario ist: -

folderA____ folderA1____folderA1a 
     \____folderA2____folderA2a 
        \___folderA2b 

... und die Frage ist, wie kann ich in alle Ordner unter dem Stamm folderA alle Dateien auflisten.

+0

Mögliches Duplikat von [So erhalten Sie eine Liste von Dateien nach Ordner auf Google Drive API] (http://stackoverflow.com/questions/24720075/how-to-get-list-of-files-by-folder-on -google-drive-api) – DaImTo

+0

Ich stimme zu, dass es viele Fragen wie diese gibt. Ich denke, du solltest deine Antwort zu einer bestehenden Frage hinzufügen, anstatt eine neue Frage zu öffnen und sie zu beantworten. Hier ist eine andere http://stackoverflow.com/q/11400669/1841839 – DaImTo

+0

und eine andere. http://stackoverflow.com/q/20923329/1841839 – DaImTo

Antwort

5

Das erste, was zu verstehen ist, dass Ordner in Google Drive keine Ordner sind!

Wir sind alle an die Idee der Ordner (aka Verzeichnisse) in Windows/nix usw. gewöhnt. In der realen Welt ist ein Ordner ein Container, in dem Dokumente abgelegt werden. Es ist auch möglich, kleinere Ordner in größeren Ordnern zu platzieren. So kann man sich den großen Ordner so vorstellen, dass er alle Dokumente in seinen kleineren Kinderordnern enthält.

Allerdings ist ein Ordner in Google Drive NICHT ein Container, so sehr, dass sie in der ersten Version von Google Drive nicht einmal Ordner genannt wurden, sie wurden Collections genannt. Ein Ordner ist einfach eine Datei mit (a) keinem Inhalt und (b) einem speziellen MIME-Typ (application/vnd.google-apps.folder). Die Art, wie Ordner verwendet werden, ist genau auf die gleiche Weise, die Tags (aka Etiketten) verwendet werden. Der beste Weg, dies zu verstehen, ist, GMail zu berücksichtigen. Wenn Sie oben auf eine geöffnete Mail sehen, sehen Sie zwei Symbole. Ein Ordner mit dem Tooltip "Move to" und ein Label mit dem Tooltip "Labels". Klicken Sie auf eine dieser beiden Optionen und das gleiche Dialogfeld erscheint und dreht sich um Etiketten. Ihre Labels werden auf der linken Seite in einer Baumansicht aufgelistet, die den Ordnern sehr ähnlich ist. Es ist wichtig, dass eine E-Mail-Nachricht mehrere Labels enthalten kann. Sie können auch sagen, dass sich eine E-Mail-Nachricht in mehreren Ordnern befinden kann. Google Drive-Ordner funktionieren genauso wie Google-Labels.

Nachdem festgestellt wurde, dass ein Ordner einfach ein Label ist, gibt es nichts, was Sie davon abhält, Ihre Labels in einer Hierarchie zu organisieren, die einem Ordnerbaum ähnelt. Tatsächlich ist dies die gebräuchlichste Methode.

Es sollte jetzt klar sein, dass eine Datei (nennen wir es MyFile) in FolderA2b ist kein Kind oder Enkel von FolderA. Es ist einfach eine Datei mit einem Label ("Elternteil" genannt) von "folderA2b".

OK, also wie bekomme ich alle Dateien "unter" OrdnerA?

Alternative 1. Rekursion

Die Versuchung, die Kinder ordnerA, für alle Kinder zur Liste wäre, die Ordner sind, rekursiv ihre Kinder Liste, spülen, wiederholen. In einer sehr kleinen Zahl von Fällen, könnte dies der beste Ansatz sein, aber für die meisten, hat es die folgenden Probleme: -

  • Es verbraucht woefully Zeit einen Server Rundfahrt für jeden Unter Ordner zu tun. Dies hängt natürlich von der Größe Ihres Baumes ab. Wenn Sie also sicherstellen können, dass Ihre Baumgröße klein ist, könnte es OK sein.

Alternative 2. Die gemeinsame Mutter

Dies funktioniert am besten, wenn alle Dateien von Ihrer App erstellt werden (dh. Sie drive.file Umfang verwenden). Erstellen Sie, wie oben in der Ordnerhierarchie, einen Dummy-übergeordneten Ordner namens say "MyAppCommonParent".Wenn Sie jede Datei als Kind ihres bestimmten Ordners erstellen, machen Sie sie auch zu einem Kind von MyAppCommonParent. Dies wird viel intuitiver, wenn Sie daran denken, Ordner als Etiketten zu betrachten. Sie können nun einfach alle Descendants abrufen, indem Sie einfach MyAppCommonParent in parents abfragen.

Alternative 3. Folders erste

starten durch alle Ordner zu bekommen. Ja, alle von ihnen. Sobald Sie alle im Speicher haben, können Sie durch die Eigenschaften der Eltern crawlen und Ihre Baumstruktur und Liste der Ordner-IDs erstellen. Sie können dann eine einzelne files.list?q='folderA' in parents or 'folderA1' in parents or 'folderA1a' in parents... tun. Mit dieser Technik können Sie alles in zwei http-Aufrufe erhalten.

Alternative 2 ist die effektivste, aber funktioniert nur, wenn Sie die Dateierstellung steuern können. Alternative 3 ist im Allgemeinen effizienter als Alternative 1, aber es kann bestimmte kleine Baumgrößen geben, bei denen 1 am besten ist.

+1

Danke dafür. Die Möglichkeit, dies in zwei Aufrufen zu tun, wäre ideal, aber wie bekommen Sie alle Ordner in einem Baum in einem Anruf? Es scheint, dass der rekursive Ansatz erforderlich ist, um alle Ordner in der Baumstruktur dazu zu bringen, die aggregierte Abfrage "in Eltern" für den einzelnen Aufruf für alle Dateien in der Baumstruktur aufzubauen. Ist das nicht der Fall? – Rodzilla

+0

Es wäre auch schön, einen Code zu sehen, der Schritt 3 für Best Practices zugeordnet ist –

Verwandte Themen