希望这个问题有道理:有没有办法我可以从驱动器下载文件而不必每次重复服务帐户?例如,我有一个程序允许我备份我的Gapps组织驱动器。该计划目前的工作方式如下:
使用我在Google开发者控制台中创建的服务登录每个帐户
检查令牌作为上次备份运行到当前执行时已更改文件的来源
如果令牌不同,则执行文件列表请求并记录更改的文件的fileId和实际fileName,然后将这两个值作为2列("fileId,fileName")
放入临时文本文档中。以下是我用于文件资源列表
Console.WriteLine("Changes detected. Making notes while we go through these.");
if (File.Exists(savelocation + ".deltalog.tok"))
File.Delete(savelocation + ".deltalog.tok");
using (StreamWriter deltalog = new StreamWriter(savelocation + ".deltalog.tok", true))
{
while (pageToken != null)
{
counter1++;
var request = CreateService.BuildService(user).Changes.List(pageToken);
//StreamWriter deltalog = new StreamWriter(savelocation + ".deltalog.tok", true);
request.Fields = "*";
request.Spaces = "drive";
var changes = request.Execute();
foreach (var change in changes.Changes)
{
try
{
string updatedfile = change.File.Name;
//string updatedfile = CreateService.BuildService(user).Files.Get(change.FileId).Execute().Name;
// Record the changed file
Console.WriteLine(user + ": New or changed file found: " + updatedfile + "\n");
logFile.WriteLine(user + ": New or changed file found: " + change.FileId + " --- " + updatedfile);
deltalog.Write(change.FileId + "," + updatedfile+"\n");
deltalog.Flush();
}
开始将文件作为文档导出到我的服务器进行备份。为此,我使用我的服务帐户3登录Gapps域,每个用户使用一个文件。现在,我正在读取从步骤3创建的文件并拆分值,以便我手头有fileId和Filename。代码如下所示:
FilesResource.ListRequest listRequest = CreateService.BuildService(user).Files.List();
listRequest.PageSize = 1000;
listRequest.Fields = "nextPageToken, files(id, name)";
string[] deltafiles = File.ReadAllLines(savelocation + ".deltalog.tok");
IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute()
.Files;
Console.WriteLine("\nFiles to backup:\n");
if (deltafiles == null)
{
return;
}
else
{
foreach (var file in deltafiles)
{
try
{
// Our file is a CSV. Column 1 = file ID, Column 2 = File name
var values = file.Split(',');
string fileId = values[0];
string fileName = values[1];
fileName = fileName.Replace('\\', '_').Replace('/', '_').Replace(':', '_').Replace('!', '_').Replace('\'', '_').Replace('*', '_');
Console.WriteLine("Filename: " + values[1]);
logFile.WriteLine("ID: " + values[0] + " - Filename: " + values[1]);
var requestfileid = CreateService.BuildService(user).Files.Get(fileId);
var getfile = CreateService.BuildService(user).Files.Get(fileId).Execute();
var request = CreateService.BuildService(user).Files.Export(fileId, getfile.MimeType);
等等。
如果我尝试将requestfileid更改为值[0](这将是循环中该文件的fileId),那么MediaDownloader不起作用,因为它不再是文件的一部分。获取构造函数。
我有什么可以做或忽略的,这样服务帐户只需登录一次即可完成每个帐户所需的一切吗?
希望胡言乱语是有道理的。
我一直在使用https://developers.google.com/drive/v3/web/quickstart/dotnet和API文档作为我的信息来源,并且我按照我想要的方式工作,除了必须多次登录服务文件。任何帮助或指向正确的方向肯定会受到赞赏。谢谢!