2017-01-19 4 views
3

Это часто задаваемый вопрос.Как выполнять поиск подпапок и под-папок на Google Диске?

Сценарий: -

folderA____ folderA1____folderA1a 
     \____folderA2____folderA2a 
        \___folderA2b 

... и вопрос, как я список всех файлов во всех папках в корне folderA.

+0

Возможный дубликат [Как получить список файлов по папке на Google Диске API] (http://stackoverflow.com/questions/24720075/how-to-get-list-of-files-by-folder-on -google-drive-api) – DaImTo

+0

Я согласен, что таких вопросов очень много. Думаю, вы должны добавить свой ответ на существующий вопрос, а затем открыть новый вопрос и ответить на него. Вот еще один http://stackoverflow.com/q/11400669/1841839 – DaImTo

+0

и еще один. http://stackoverflow.com/q/20923329/1841839 – DaImTo

ответ

5

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

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

Однако на Диске Google папка НЕ Контейнер, так что в первой версии Google Диска их даже не называли Папки, их называли Коллекциями. Папка - это просто Файл с (a) без содержимого и (b) специальный тип mime-типа (application/vnd.google-apps.folder). Способ использования Folders - точно так же, как теги (aka labels). Лучший способ понять это - рассмотреть GMail. Если вы посмотрите вверху открытого сообщения, вы увидите две значки. Папка с подсказкой «Переместить в» и ярлык с подсказкой «Ярлыки». Нажмите на любой из них, и появится одно и то же диалоговое окно, и все это касается ярлыков. Ваши ярлыки перечислены с левой стороны, на древовидном дисплее, который очень похож на папки. Важно отметить, что почтовый элемент может иметь несколько ярлыков или, можно сказать, почтовый элемент может быть в нескольких папках. Папки Google Диска работают точно так же, как работает ярлыки GMail.

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

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

ОК, так как я могу получить все файлы «под» folderA?

Альтернатива 1. Рекурсия

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

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

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

Это работает лучше всего, если все файлы создаются с помощью вашего приложения (то есть. Вы используете рамки drive.file). Как и иерархия папок выше, создайте фиктивную родительскую папку, называемую «MyAppCommonParent».Когда вы создаете каждый файл в качестве дочернего элемента его конкретной папки, вы также делаете его дочерним элементом MyAppCommonParent. Это становится намного более интуитивным, если вы не задумываетесь о том, что Folders являются ярлыками. Теперь вы можете легко получить все descdantants, просто запросив MyAppCommonParent in parents.

Альтернативные 3. Папки первый

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

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

+1

Спасибо за это. Возможность сделать это в двух вызовах будет идеальной, но как вы получите все папки в дереве за один вызов? Кажется, требуется рекурсивный подход, чтобы получить все папки в дереве, чтобы собрать агрегированный запрос «в родителях» для единого вызова для всех файлов в дереве. Разве это не так? – Rodzilla

+0

Также было бы замечательно увидеть некоторый код, связанный с шагом 3 для лучших практик –