Google Drive API .NET的嵌套文件夹查找

时间:2018-08-01 19:47:35

标签: c# google-drive-api google-api-dotnet-client

我已经使用他们自己的.NET Google API在Google Drive v3中实现了文件/文件夹查找。

代码可以正常工作,但是老实说,我不确定代码是否真的以一种标准有效的方式实现。

逻辑:

  1. 我必须进入每个文件夹并在其上下载特定文件。

  2. 结构可以是A> B> C> D,基本上是文件夹内的文件夹内的文件夹,依此类推。

  3. 我不能将静态预定义的目录架构用作长期解决方案,因为它可以在所有者想要修改的任何时候进行更改,目前,该文件夹的深度至少为4级。

  4. 导航到子文件夹的唯一方法是获取自己的Google云端硬盘ID,并使用其查看其内容。就像您需要先拥有一个KEY才能解锁/打开下一个子文件夹一样。

简而言之,我无法对子文件夹的内容进行简单的查找,除非有人可以为我们提供更好的选择,否则我很乐意接受任何批评,并欢迎您提出所有建议。

谢谢。

更新 谢谢大家提供的链接和示例, 我认为,递归解决方案是目前我目前为止最好的解决方案, 而且,由于这是一项繁重的IO操作,因此我确实将ASYNC操作用于下载文件,并尽可能将其应用于其余部分,因此我确保遵循ASYNC ALL THE WAY规则以防止阻塞。

调用递归方法

var parentID = "<folder id>";
var folderLevel = 0;
var listRequest = service.Files.List();
await MyTask(listRequest, id, count, folderLevel);

这是递归方法,它将从定义的设置的根父代ID中搜索所有可能的文件夹...

private async Task RecursionTask(ListRequest listRequest, string parentId, int count, int folderLevel)
{
    // This method do the Folder search
    listRequest.Q = $"('{parentId}' in parents) and (mimeType = 'application/vnd.google-apps.folder') and trashed = false";
    listRequest.Fields = "files(id,name)";

    var filesTask = await listRequest.ExecuteAsync();
    var files = filesTask.Files;

    count = files.Count(); // Keep track of recursion flow
    count--;

    // Keep track of how deep recursion is diving on subfolders
    folderLevel++; 

    var tasks = new List<Task>();
    foreach(var file in files)
    {
        tasks.Add(InnerTask(file, listRequest, name, folderLevel)); // Create Array Of Tasks for IMAGE Search
        if (count > 1)  // Loop until I exhausted the value of count
        {
            // Return recursion flow
            await RecursionTask(listRequest, file.Name, file.Id, count, folderLevel);  
        }
    }
    await Task.WhenAll(tasks); // Wait all tasks to finish
}

这是将处理驱动器文件下载的innerTask

private async Task InnerTask(File file, ListRequest listRequest, string name,int folderLevel)
{
    // This method do the IMAGE SEARCH 
    listRequest.Q = $"('{file.Id}' in parents) and (mimeType = 'image/jpeg' or mimeType = 'image/png')";
    listRequest.Fields = "files(id,name)";

    var subFiles = await listRequest.ExecuteAsync();
    foreach (var subFile in subFiles.Files)
    {
        // Do Async task for downloading images on Google Drive
    }
}

0 个答案:

没有答案