如何在C#中列出来自Google Drive API V3的1000多条记录

这是此链接中原始问题的延续。

通过下面的代码,我可以获取1000条记录,但我的驱动器总共有6500条++记录。 搜索谷歌但无法找到正确的解决方案。

根据参考,参数“pageSize”的描述值是“每页返回的最大文件数。可接受的值是1到1000,包括1。(默认值:100)”。

所以这意味着,我们只能获得1000条记录,如果可能的话,那么方式是什么。 另外,我不了解参数“pageToken”,实时使用’nextPageToken’值是什么。

代码:( https://developers.google.com/drive/v3/web/quickstart/dotnet )

namespace gDrive { class Program { static string[] Scopes = { DriveService.Scope.DriveReadonly }; static string ApplicationName = "Drive API .NET Quickstart"; static void Main(string[] args) { UserCredential credential; gDriveTableAdapter gDrive = new gDriveTableAdapter(); using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) { string credPath = System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal); credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json"); credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result; //Console.WriteLine("Credential file saved to: " + credPath); } // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); // Define parameters of request. FilesResource.ListRequest listRequest = service.Files.List(); listRequest.PageSize = 1000; listRequest.Fields = "nextPageToken, files(webViewLink, name)"; // List files. IList files = listRequest.Execute() .Files; Console.WriteLine("Processing...\n"); if (files != null && files.Count > 0) { foreach (var file in files) { gDrive.InsertQuery(file.Name, file.WebViewLink); } Console.WriteLine(files.Count + " records fetched."); } else { Console.WriteLine("No files found."); } Console.Read(); } } } 

如果你需要下载分页,你也可以通过C#SDK实现它。 诀窍是跟踪listRequest.Execute()返回值,它包含几个变量,它们之间是NextPageToken。 此部分在标准谷歌示例中 “隐藏”。

 FilesResource.ListRequest listRequest = _service.Files.List(); listRequest.PageSize = 100; listRequest.Fields = "nextPageToken, files(id, name)"; // List files. var result = listRequest.Execute(); IList files =result.Files; Console.WriteLine("Files:"); while (files!=null && files.Count > 0) { foreach (var file in files) { Console.WriteLine("{0} ({1})", file.Name, file.Id); } if (!string.IsNullOrWhiteSpace(result.NextPageToken)) { listRequest = _service.Files.List(); listRequest.PageToken = result.NextPageToken; listRequest.PageSize = 100; listRequest.Fields = "nextPageToken, files(id, name)"; result = listRequest.Execute(); files = result.Files; } } 

您可以发出多个请求并从每个页面获取数据。 由于安全原因,这些物品在页面上潜水

通过Google Script实现。 感谢mesgarpour( 链接 )。

 var folderId = "Enter the Folder Id here"; // Main function 1: List all folders, & write into the current sheet. function listFolders(){ getFolderTree(folderId, false); }; // Main function 2: List all files & folders, & write into the current sheet. function listAll(){ getFolderTree(folderId, true); }; // ================= // Get Folder Tree function getFolderTree(folderId, listAll) { try { // If you want to search from the top (root) folder var parentFolder = DriveApp.getRootFolder(); // If you want a tree of any sub folder //var parentFolder = DriveApp.getFolderById(folderId); // Initialise the sheet var file, data, sheet = SpreadsheetApp.getActiveSheet(); sheet.clear(); sheet.appendRow(["Full Path", "Name", "Date", "URL", "Last Updated", "Description", "Size"]); // Get files and folders getChildFolders(parentFolder.getName(), parentFolder, data, sheet, listAll); } catch (e) { Logger.log(e.toString()); } }; // Get the list of files and folders and their metadata in recursive mode function getChildFolders(parentName, parent, data, sheet, listAll) { var childFolders = parent.getFolders(); // List folders inside the folder while (childFolders.hasNext()) { var childFolder = childFolders.next(); // Logger.log("Folder Name: " + childFolder.getName()); data = [ parentName + "/" + childFolder.getName(), childFolder.getName(), childFolder.getDateCreated(), childFolder.getUrl(), childFolder.getLastUpdated(), childFolder.getDescription(), childFolder.getSize() ]; // Write sheet.appendRow(data); // List files inside the folder var files = childFolder.getFiles(); while (listAll & files.hasNext()) { var childFile = files.next(); // Logger.log("File Name: " + childFile.getName()); data = [ parentName + "/" + childFolder.getName() + "/" + childFile.getName(), childFile.getName(), childFile.getDateCreated(), childFile.getUrl(), childFile.getLastUpdated(), childFile.getDescription(), childFile.getSize() ]; // Write sheet.appendRow(data); } // Recursive call of the subfolder getChildFolders(parentName + "/" + childFolder.getName(), childFolder, data, sheet, listAll); } }; 

这是一个改进的(IMO)版本的EDR很好的答案,不重复listRequest代码:

 List allFiles = new List(); Google.Apis.Drive.v3.Data.FileList result = null; while (true) { if (result != null && string.IsNullOrWhiteSpace(result.NextPageToken)) break; FilesResource.ListRequest listRequest = service.Files.List(); listRequest.PageSize = 1000; listRequest.Fields = "nextPageToken, files(id, name)"; if (result != null) listRequest.PageToken = result.NextPageToken; result = listRequest.Execute(); allFiles.AddRange(result.Files); }