Как искать подпапки и подпапки в Google Диске?

это часто задаваемый вопрос.

сценарий:-

folderA____ folderA1____folderA1a
       ____folderA2____folderA2a
                    ___folderA2b

... и вопрос в том, как перечислить все файлы во всех папках под корнем folderA.

1 ответов


первое, что нужно понять, это то, что в Google Drive папки не являются папками!

мы все привыкли к идее папки (каталоги ака) в Windows/шухер и т. д. В реальном мире папка-это контейнер, в который помещаются документы. Кроме того, можно разместить небольшие папки внутри больших папок. Таким образом, большая папка может рассматриваться как содержащая все документы внутри своих меньших дочерних папок.

однако, в Google Диск, папка не контейнер, настолько, что в первом выпуске Google Drive они даже не назывались папками, они назывались коллекциями. Папка-это просто файл с (а) без содержимого и (Б) специальным MIME-типом (application/vnd.службы Google.папка.) Способ использования папок -ровно так же, как используются теги (aka labels). Лучший способ понять это-рассмотреть GMail. Если вы посмотрите на верхнюю часть открытого почтового элемента, вы увидите два иконы. Папка с подсказкой "переместить в" и меткой с подсказкой "метки". Нажмите на любой из них, и появится то же диалоговое окно и все о метках. Ваши метки перечислены вниз по левой стороне, в дереве, которое выглядит как папки. Важно отметить, что почтовый элемент может иметь несколько меток, или вы можете сказать, почтовый элемент может быть в нескольких папках. Папки Google Drive работают точно так же, как работают метки GMail.

установив, что папка это просто ярлык, ничто не мешает вам организовать ваши ярлыки в иерархию, которая напоминает дерево папок, на самом деле это самый распространенный способ.

теперь должно быть ясно, что файл (назовем его MyFile) в folderA2b не является ребенком или внуком folderA. Это просто файл с меткой (смутно называемой родительской) "folderA2b".

OK, так как мне получить все файлы " под" папкаа?

Вариант 1. Рекурсия

искушение будет список детей папкаа для детей, которые папки, рекурсивно список детей, смыть, повторить. В очень небольшом количестве случаев это может быть лучший подход, но для большинства из них он имеет следующие проблемы: -

  • это прискорбно много времени, чтобы сделать сервер туда и обратно для каждой подпапки. Это, конечно, зависит от размера дерево, поэтому если вы можете гарантировать, что ваш размер дерева небольшой, это может быть нормально.

вариант 2. Общий родитель

Это лучше всего работает, если все файлы создаются вашим приложением (т. е. вы используете диск.область действия файла). Как и иерархия папок выше, создайте фиктивную родительскую папку под названием "MyAppCommonParent". При создании каждого файла в качестве дочернего элемента его конкретной папки вы также делаете его дочерним элементом MyAppCommonParent. Это становится гораздо более интуитивным, если вы помните, чтобы думать о папках в качестве меток. Теперь вы можете легко получить все descdendants, просто запросив MyAppCommonParent in parents.

вариант 3. Сначала папки

начните с получения всех папок. Да, все они. После того, как они все в памяти, вы можете просмотреть их свойства родителей и построить древовидную структуру и список идентификаторов папок. Затем вы можете сделать один files.list?q='folderA' in parents or 'folderA1' in parents or 'folderA1a' in parents.... Используя эту технику, вы можете получить все в двух http звонки.

псевдо-код для варианта 3 немного похож...

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

вариант 2 является наиболее effificient, но работает только если у вас есть контроль создания файла. Альтернатива 3 обычно более эффективна, чем альтернатива 1, но могут быть некоторые небольшие размеры деревьев, где 1 лучше всего.