使用Google Drive API获取文件夹层次结构[C#/ .NET]

时间:2016-03-17 05:13:40

标签: c# .net visual-studio c#-4.0 google-drive-api

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

目前,您可以通过

获取根文件夹及其父项
var getRequest = driveService.Files.Get("root");
getRequest.Fields = "parents";
var file = getRequest.Execute();

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

3 个答案:

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

此代码生成类似

的输出

enter image description here

但是,正如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;