我正在寻找一种优雅的方式来获取文件夹层次结构,从我的根文件夹开始,使用C#Google Drive API V3。
目前,您可以通过
获取根文件夹及其父项var getRequest = driveService.Files.Get("root");
getRequest.Fields = "parents";
var file = getRequest.Execute();
但我正在寻找一种方法来让孩子们,而不是父母,所以我可以递归下去文件结构。
设置getRequest.Fields = 'children'
不是有效的字段选项。
答案 0 :(得分:5)
以递归方式提取子项是一种非常耗时的方法来获取完整的层次结构。更好的方法是运行查询以获取单个GET中的所有文件夹(如果您有超过1,000个文件夹,则可能需要多个文件夹),然后遍历其父属性以在内存中构建层次结构。请记住,(afaik)没有任何东西阻止文件夹层次结构是循环的,因此folder1拥有folder2拥有folder3拥有folder1,所以无论你遵循哪种策略,检查你是不是在循环中。
如果您是GDrive的新手,那么很早就意识到文件夹只是标签而不是容器,这一点非常重要。因此,具有多个父项的循环关系和文件是很正常的。它们最初被称为Collections,但是被重命名为Folders以安抚那些无法了解标签的社区成员。
答案 1 :(得分:2)
我希望这是您正在寻找的答案。 getHeirarchy
递归挖掘Google云端硬盘并将文件标题存储到文本文件中。
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
可以替换为任何目录的ID以获得它的结构。这将生成整个Drive的结构。
ResFromFolder
方法返回目录中包含的Google.Apis.Drive.v2.Data.File
元数据列表。
public List<Google.Apis.Drive.v2.Data.File> ResFromFolder(DriveService service, string folderId)
{
var request = service.Children.List(folderId);
request.MaxResults = 1000;
List<Google.Apis.Drive.v2.Data.File> TList = new List<Google.Apis.Drive.v2.Data.File>();
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提到的那样,如果云端硬盘包含大量文件和文件夹,则会耗费大量时间。
答案 2 :(得分:0)
Get folder hierarchy with Google Drive API [C# / .NET]
Google.Apis.Drive.v3.DriveService service = GetService();
List<GoogleDriveFile> folderList = new List<GoogleDriveFile>();
Google.Apis.Drive.v3.FilesResource.ListRequest request = service.Files.List();
//https://developers.google.com/drenter code hereive/api/v3/search-shareddrives
request.Q = string.Format("mimeType='application/vnd.google-apps.folder' and '{0}' in parents", folderId)`enter code here`;
request.Fields = "files(id, name)";
Google.Apis.Drive.v3.Data.FileList result = request.Execute();
foreach (var file in result.Files)
{
GoogleDriveFile googleDriveFile = new GoogleDriveFile
{
Id = file.Id,
Name = file.Name,
Size = file.Size,
Version = file.Version,
CreatedTime = file.CreatedTime,
Parents = file.Parents
};
folderList.Add(googleDriveFile);
}
return folderList;