如何使用 Google Drive API 获取所有 TeamDrives、文件夹和文件(使用分页)

时间:2021-04-09 15:58:14

标签: c# .net google-drive-api google-api-dotnet-client google-drive-shared-drive

我必须检查所有团队驱动器、文件夹和文件,并且我拥有的代码运行良好:

 /// <summary>
        /// Get All files inside a folder
        /// </summary>
        /// <param name="service"></param>
        /// <param name="folderId"></param>
        /// <param name="td"></param>
        /// <returns></returns>
        private static async Task<Google.Apis.Drive.v3.Data.FileList> GetAllFilesInsideFolder(DriveService service, string folderId, TeamDrive td)
        {
            string FolderId = folderId;
            // Define parameters of request.
            FilesResource.ListRequest listRequest = service.Files.List();
            listRequest.Corpora = "drive";
            listRequest.SupportsAllDrives = true;
            listRequest.DriveId = td.Id;
            listRequest.PageSize = 100;
            listRequest.IncludeItemsFromAllDrives = true;
            listRequest.Q = "'" + FolderId + "' in parents and trashed=false";
            listRequest.Fields = "nextPageToken, files(*)";

            // List files.
            Google.Apis.Drive.v3.Data.FileList files = await listRequest.ExecuteAsync();

            return files;
        }

        /// <summary>
        /// Gets all folders from an specific team drive
        /// </summary>
        /// <param name="service"></param>
        /// <param name="td"></param>
        /// <returns></returns>
        private static async Task<Google.Apis.Drive.v3.Data.FileList> GetAllFoldersFromTeamDriveAsync(DriveService service, TeamDrive td)
        {
            try
            {
                var request = service.Files.List();
                request.Corpora = "drive";
                request.SupportsAllDrives = true;
                request.DriveId = td.Id;
                request.PageSize = 100;
                request.IncludeItemsFromAllDrives = true;
                request.Q = "mimeType = 'application/vnd.google-apps.folder'";
                var response = await request.ExecuteAsync();
                return response;
            }
            catch (Exception ex )
            {
                Console.WriteLine("GetAllFoldersFromTeamDriveAsync Error: " + ex.Message);
                throw;
            }
        }


        /// <summary>
        /// Gets all teamdrives
        /// </summary>
        /// <param name="service"></param>
        /// <returns></returns>
        private static async Task<Google.Apis.Drive.v3.Data.TeamDriveList> GetAllTeamDrivesAsync(DriveService service)
        {
            try
            {
                var request = service.Teamdrives.List();
                request.PageSize = 100;
                var response = await request.ExecuteAsync();
                return response;
            }
            catch (Exception ex)
            {
                Console.WriteLine("GetAllTeamDrivesAsync Error" + ex.Message);
                throw;
            }
        }

主要方法:

public async Task  RunFix()
        {
            UserCredential credential;
            Directory.CreateDirectory(StorageLocation);
            var DataStore = new FileDataStore(StorageLocation);
            using var stream = new FileStream(CredentialsString, FileMode.Open, FileAccess.Read);

            // Please give consent to the Auth/drive scope
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                Username,
                CancellationToken.None,
                DataStore).Result;
            try
            {
                var service = new DriveService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = ApplicationName,
                });

                var clientbillCycleGoogleDriveFilesDEV = new TableClient("...");

                // Get All team drives
                var allTeamDrives = await GetAllTeamDrivesAsync(service);

                // We will use a CSV to copy the unmapped files
                var csvUnmappedBillCycleFiles = new StringBuilder();

                //Iterate over all Team Drives I have access to:
                foreach (TeamDrive td in allTeamDrives.TeamDrives)
                {
                    if (td.Name == "XXX")
                    {
                        Console.WriteLine("Team Drive: " + td.Name);
                        Stopwatch sAllFilesInsideFolder = Stopwatch.StartNew();

                        // Get All Folders inside this team drive
                        var allFolders = await GetAllFoldersFromTeamDriveAsync(service, td);
                        foreach (Google.Apis.Drive.v3.Data.File file in allFolders.Files)
                        {
                            Console.WriteLine("--Folder-- " + file.Name);
              
                            if (file.Name.StartsWith("xyz"))
                            {
                                 //some business logic
                              
                                foreach (Google.Apis.Drive.v3.Data.File googlefile in allFilesInsideFolder.Files)
                                {
                                   //some business logic
                                }
                       
                            }
                        }

  
                    }
                }

                System.IO.File.WriteAllText("csvUnmappedBillCycleFiles.csv", csvUnmappedBillCycleFiles.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error" + ex.Message);
            }
        }

问题是我无法将 PageSize 设置为 100 以上。

如何更改此代码以实际执行所有操作?

1 个答案:

答案 0 :(得分:2)

假设您使用的是 drives listfiles list。这只是猜测,因为您没有包含代码 GetAllTeamDrivesAsync? GetAllFoldersFromTeamDriveAsync。

您可以在 file.list 方法中将页面大小设置为最大 1000。

var request = service.Files.List();   
request.PageSize = 1000;

但是那你仍然需要在页面上分页。我建议使用 pageStreamer。它将为您遍历每一行。

 var request = service.Files.List();
 request.PageSize = 1000;
            
 var pageStreamer =
                new Google.Apis.Requests.PageStreamer<Google.Apis.Drive.v3.Data.File, FilesResource.ListRequest,
                    Google.Apis.Drive.v3.Data.FileList, string>(
                    (req, token) => request.PageToken = token,
                    response => response.NextPageToken,
                    response => response.Files);
            
 // data storage
 var all = new Google.Apis.Drive.v3.Data.FileList();
 all.Files = new List<Google.Apis.Drive.v3.Data.File>();
            
 // fetching data and adding it to storage
 foreach (var result in await pageStreamer.FetchAllAsync(request, CancellationToken.None))
            {
                all.Files.Add(result);
            }

我有一个视频来解释 pagestreamer 的工作原理How to use the nextpagetoken from the files list method in the Google Drive api v3.

您应该也可以将 pagestreamer 与驱动器列表一起使用。

相关问题