Obtenga la jerarquía de carpetas con Google Drive API

Estoy buscando una forma elegante de obtener la jerarquía de carpetas, comenzando con mi carpeta raíz, utilizando el C # Google Drive API V3.

Actualmente, puede obtener la carpeta raíz y sus padres por

var getRequest = driveService.Files.Get("root"); getRequest.Fields = "parents"; var file = getRequest.Execute(); 

pero estoy buscando una manera de conseguir a los niños, no a los padres, para poder recursivamente bajar la estructura de archivos. Configurar getRequest.Fields = 'children' no es una opción de campo válida.

recursivamente obtener hijos es una forma muy lenta de obtener la jerarquía completa. Mucho mejor es ejecutar una consulta para obtener todas las carpetas en un solo GET (bueno, podría tomar más de una si tiene más de 1,000 carpetas) y luego recorrer sus propiedades principales para construir la jerarquía en la memoria. Tenga en cuenta que (afaik) no hay nada que impida que una jerarquía de carpetas sea cíclica, por lo que la carpeta1 es propietaria de la carpeta2 posee la carpeta3, por lo que, independientemente de la estrategia que siga, verifique que no esté en un ciclo.

Si eres nuevo en GDrive, es importante que te des cuenta de que las carpetas son simplemente tags, en lugar de contenedores. Así que las relaciones cíclicas y los archivos con múltiples padres son bastante normales. Originalmente se llamaban Colecciones, pero se les cambió el nombre a Carpetas para apaciguar a los miembros de la comunidad que no podían entender sus tags.

Espero que esta sea la respuesta que estabas buscando. getHeirarchy excava Google Drive y almacena los títulos de los archivos en un archivo de texto.

 public System.IO.StreamWriter w = new System.IO.StreamWriter("Hierarchy.txt", false); string intend = " "; private void getHierarchy(Google.Apis.Drive.v2.Data.File Res, DriveService driveService) { if (Res.MimeType == "application/vnd.google-apps.folder") { w.Write(intend + Res.Title + " :" + Environment.NewLine); intend += " "; foreach (var res in ResFromFolder(driveService, Res.Id).ToList()) getHierarchy(res, driveService); intend = intend.Remove(intend.Length - 5); } else { w.Write(intend + Res.Title + Environment.NewLine); } } 

Puedes llamar a la función algo como:

 w.Write("My Drive:" + Environment.NewLine); foreach (var Res in ResFromFolder(driveService, "root").ToList()) getHierarchy(Res, driveService); w.Close(); 

Aquí, la root se puede reemplazar con el ID de cualquier directorio para obtener su estructura. Esto generará toda la estructura del Drive.

El método ResFromFolder devuelve una lista de metadatos de Google.Apis.Drive.v2.Data.File contenidos en un directorio.

 public List ResFromFolder(DriveService service, string folderId) { var request = service.Children.List(folderId); request.MaxResults = 1000; List TList = new List(); do { var children = request.Execute(); foreach (ChildReference child in children.Items) { TList.Add(service.Files.Get(child.Id).Execute()); } request.PageToken = children.NextPageToken; } while (!String.IsNullOrEmpty(request.PageToken)); return TList; } 

Este código produce salida algo como

introduzca la descripción de la imagen aquí

Sin embargo, como lo mencionó Pinoyyid , consume bastante tiempo si Drive contiene una gran cantidad de archivos y carpetas.