如何在 C# 中列出来自 Google Drive API V3 的超过 1000 条记录
How to list of more than 1000 records from Google Drive API V3 in C#
这是 link 中原始问题的延续。
通过下面的代码,我可以获取 1000 条记录,但我的驱动器中总共有 6500++ 条记录。正在搜索 google 但找不到正确的解决方案。
根据参考,参数"pageSize"的描述值为"The maximum number of files to return per page. Acceptable values are 1 to 1000, inclusive. (Default: 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<Google.Apis.Drive.v3.Data.File> 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();
}
}
}
您可以发出多个请求并从每个页面获取数据。这些项目因安全原因在页面上潜水
通过 Google 脚本实现。感谢 mesgarpour (link).
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);
}
};
如果需要下载paginating也可以通过C#SDK实现。
诀窍在于跟踪 listRequest.Execute() return 值,该值包含多个变量以及它们之间的 NextPageToken。这部分是 "hidden" 在 standard google example.
FilesResource.ListRequest listRequest = _service.Files.List();
listRequest.PageSize = 100;
listRequest.Fields = "nextPageToken, files(id, name)";
// List files.
var result = listRequest.Execute();
IList<Google.Apis.Drive.v3.Data.File> 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;
}
}
这是 EDR 出色答案的改进 (IMO) 版本,不重复 listRequest 代码:
List<Google.Apis.Drive.v3.Data.File> allFiles = new List<Google.Apis.Drive.v3.Data.File>();
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);
}
这是 link 中原始问题的延续。
通过下面的代码,我可以获取 1000 条记录,但我的驱动器中总共有 6500++ 条记录。正在搜索 google 但找不到正确的解决方案。
根据参考,参数"pageSize"的描述值为"The maximum number of files to return per page. Acceptable values are 1 to 1000, inclusive. (Default: 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<Google.Apis.Drive.v3.Data.File> 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();
}
}
}
您可以发出多个请求并从每个页面获取数据。这些项目因安全原因在页面上潜水
通过 Google 脚本实现。感谢 mesgarpour (link).
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);
}
};
如果需要下载paginating也可以通过C#SDK实现。 诀窍在于跟踪 listRequest.Execute() return 值,该值包含多个变量以及它们之间的 NextPageToken。这部分是 "hidden" 在 standard google example.
FilesResource.ListRequest listRequest = _service.Files.List();
listRequest.PageSize = 100;
listRequest.Fields = "nextPageToken, files(id, name)";
// List files.
var result = listRequest.Execute();
IList<Google.Apis.Drive.v3.Data.File> 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;
}
}
这是 EDR 出色答案的改进 (IMO) 版本,不重复 listRequest 代码:
List<Google.Apis.Drive.v3.Data.File> allFiles = new List<Google.Apis.Drive.v3.Data.File>();
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);
}