从Google云端硬盘中抓取所有文件(和父文件夹)的列表

时间:2016-04-15 00:24:25

标签: c#-4.0 google-drive-api

我正在尝试查询Google云端硬盘中前10个文件的列表。连同文件我想要获取它所在的目录......

必须有一个更好的方法来做我想要的事情。目前我调用FindFiles()并且该函数调用GetDriveObjectParentPath()以获取每个文件的父路径。由于GetDriveObjectParentPath()调用自身时出现循环,我遇到 User Rate Limit Exceeded [403] 错误!

有人可以告诉我一个更好的方法来完成我想要的完整示例吗?

private string GetDriveObjectParentPath(DriveService drive, string objectId, bool digging = false)
{
    string parentPath = "";

    FilesResource.GetRequest request = drive.Files.Get(objectId);
    request.Fields = "id, name, parents";
    Google.Apis.Drive.v3.Data.File driveObject = request.Execute();

    if (digging)
        parentPath += "/" + driveObject.Name;

    if (driveObject.Parents != null)
        parentPath = GetDriveObjectParentPath(drive, driveObject.Parents[0], true) + parentPath;

    return parentPath;
}

private bool FindFiles()
{
    //Setup the API drive service
    DriveService drive = new DriveService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = m_credentials,
        ApplicationName = System.AppDomain.CurrentDomain.FriendlyName,
    });

    //Setup the parameters of the request
    FilesResource.ListRequest request = drive.Files.List();
    request.PageSize = 10;
    request.Fields = "nextPageToken, files(mimeType, id, name, parents)";

    //List first 10 files
    IList<Google.Apis.Drive.v3.Data.File> files = request.Execute().Files;
    if (files != null && files.Count > 0)
    {
        foreach (Google.Apis.Drive.v3.Data.File file in files)
        {
            Console.WriteLine("{0} ({1})", file.Name, file.Id);

            string parentPath = GetDriveObjectParentPath(drive, file.Id);

            Console.WriteLine("Found file '" + file.Name + "' that is in directory '" + parentPath + "' and has an id of '" + file.Id + "'.");
        }
    }
    else
    {
        Console.WriteLine("No files found.");
    }

    Console.WriteLine("Op completed.");
    return true;
}

使用上述内容会在一次运行中产生以下API使用情况,并导致403客户端错误... enter image description here

1 个答案:

答案 0 :(得分:1)

你的代码很好。你只需要通过更慢的速度和重试来处理403速率限制。我知道这很糟糕,但这就是Drive的运作方式。

在30次左右的请求后,我通常会看到403次限价错误,因此符合您的观察结果。

就方法而言,每当我看到包含“文件夹层次结构”的问题时,我的建议总是一样的。首先使用files.list获取所有文件夹q:mimetype ='application / vnd.google-apps.folder'。然后处理该列表一次以构建内存中的层次结构。然后去获取文件并在层次结构中找到它们。永远记住,在GDrive中,“层次结构”有点虚构,因为父母只是任何给定文件/文件夹的属性。这意味着文件/文件夹可以有多个父项,并且层次结构甚至可以自行循环。