Google Drive API(v3)---将文件下载为服务

时间:2016-02-24 16:53:00

标签: c# google-drive-api

希望这个问题有道理:有没有办法我可以从驱动器下载文件而不必每次重复服务帐户?例如,我有一个程序允许我备份我的Gapps组织驱动器。该计划目前的工作方式如下:

  1. 使用我在Google开发者控制台中创建的服务登录每个帐户

  2. 检查令牌作为上次备份运行到当前执行时已更改文件的来源

  3. 如果令牌不同,则执行文件列表请求并记录更改的文件的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();
                }
    
  4. 开始将文件作为文档导出到我的服务器进行备份。为此,我使用我的服务帐户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); 
    
  5. 等等。

    如果我尝试将requestfileid更改为值[0](这将是循环中该文件的fileId),那么MediaDownloader不起作用,因为它不再是文件的一部分。获取构造函数。

    我有什么可以做或忽略的,这样服务帐户只需登录一次即可完成每个帐户所需的一切吗?

    希望胡言乱语是有道理的。

    我一直在使用https://developers.google.com/drive/v3/web/quickstart/dotnet和API文档作为我的信息来源,并且我按照我想要的方式工作,除了必须多次登录服务文件。任何帮助或指向正确的方向肯定会受到赞赏。谢谢!

0 个答案:

没有答案