我正在尝试查询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;
}
答案 0 :(得分:1)
你的代码很好。你只需要通过更慢的速度和重试来处理403速率限制。我知道这很糟糕,但这就是Drive的运作方式。
在30次左右的请求后,我通常会看到403次限价错误,因此符合您的观察结果。
就方法而言,每当我看到包含“文件夹层次结构”的问题时,我的建议总是一样的。首先使用files.list获取所有文件夹q:mimetype ='application / vnd.google-apps.folder'。然后处理该列表一次以构建内存中的层次结构。然后去获取文件并在层次结构中找到它们。永远记住,在GDrive中,“层次结构”有点虚构,因为父母只是任何给定文件/文件夹的属性。这意味着文件/文件夹可以有多个父项,并且层次结构甚至可以自行循环。