使用Google Drive API获取文件夹层次结构

我正在寻找一种优雅的方式来获取文件夹层次结构,从我的根文件夹开始,使用C#Google Drive API V3。

目前,您可以通过以下方式获取根文件夹及其父文件夹

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

但我正在寻找一种方法来获得孩子,而不是父母,所以我可以递归下去文件结构。 设置getRequest.Fields = 'children'不是有效的字段选项。

递归获取子项是一种非常耗时的方法来获取完整的层次结构。 更好的方法是运行查询以获取单个GET中的所有文件夹(如果您有超过1,000个文件夹,则可能需要多个文件夹),然后遍历其父属性以在内存中构建层次结构。 请记住,(afaik)没有任何东西阻止文件夹层次结构是循环的,因此folder1拥有folder2拥有folder3拥有folder1,所以无论你遵循哪种策略,检查你是不是在循环中。

如果您是GDrive的新手,重要的是要尽早意识到文件夹只是标签而不是容器。 因此,具有多个父项的循环关系和文件是很正常的。 它们最初被称为Collections,但是被重命名为Folders以安抚那些无法理解标签的社区成员。

我希望这是你正在寻找的答案。 getHeirarchy递归地挖掘Google Drive并将文件标题存储到文本文件中。

 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); } } 

你可以调用这个函数:

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

在这里, root可以替换为任何Directory的ID以获得它的结构。 这将生成整个Drive的结构。

ResFromFolder方法返回目录中包含的Google.Apis.Drive.v2.Data.File元数据列表。

 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; } 

此代码生成类似的输出

在此处输入图像描述

但是,正如pinoyyid所提到的,如果Drive包含大量文件和文件夹,它会消耗大量时间。