Google Driveのファイルをダウンロードする - C#

C#のプログラムでGoogle Driveのファイルをダウンロードするコードを紹介します。

事前準備

Google Drive API の有効化

Google Drive APIを有効化します。手順はこちらの記事を参照してください。

Google APIのサービスアカウントを作成

Google APIのサービスアカウントを作成します。アカウントの作成手順はこちらの記事 を参照してください。

Google API サービスアカウントの認証キーを作成

Google API サービスアカウントの認証キーを作成します。 作成の具体的な手順はこちらの記事を参照してください。
今回はJSON形式のキーファイルを作成しています。

Google Driveの準備

Google Drive にログインし共有フォルダを作成し、先の手順で作成したサービスアカウントと共有します。
具体的な操作手順はこちらの記事を参照して下さい。

C#プロジェクトの作成

C#のプロジェクトを作成します。今回はWindows Formアプリケーションを作成します。
作成したプロジェクトに Google.Apis.Drive.V3 パッケージをインストールします。 インストールの手順はこちらの記事を参照してください。

プログラム

UI

下図のフォームを作成します。テキストボックスを2つ、ボタンを1つ配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Google.Apis.Drive.v3;
using System.IO;


namespace GoogleDriveDownload
{
  public partial class FormSimpleFileDownload : Form
  {
    public FormSimpleFileDownload()
    {
      InitializeComponent();
    }

    static string[] Scopes = { DriveService.Scope.Drive };

    private void button1_Click(object sender, EventArgs e)
    {
      FileStream fs = new FileStream("(JSONキーファイルのパス)", FileMode.Open, FileAccess.Read);
      Google.Apis.Auth.OAuth2.GoogleCredential credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromStream(fs).CreateScoped(Scopes);

      Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
      init.HttpClientInitializer = credential;
      init.ApplicationName = "My Test App";
      DriveService service = new DriveService(init);

      //FileInfo
      Google.Apis.Drive.v3.Data.File file = service.Files.Get(textBox1.Text).Execute();
      textBox2.Text += string.Format("ID:{0} のファイル情報を取得しました。 MimeType:{1}\r\n", file.Name, file.MimeType);

      //Dowbnload
      FilesResource.GetRequest req = service.Files.Get(textBox1.Text);
      FileStream dfs = new FileStream("c:\\data\\"+ file.Name, FileMode.Create, FileAccess.Write);
      req.Download(dfs);
      dfs.Close();

      textBox2.Text += "ファイルのダウンロードが完了しました。\r\n";
    }
  }
}

解説

Google Drive オブジェクトの作成や認証についての詳細はこちらの記事を参照してください。
  FileStream fs = new FileStream("(JSONキーファイルのパス)", FileMode.Open, FileAccess.Read);
  Google.Apis.Auth.OAuth2.GoogleCredential credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromStream(fs).CreateScoped(Scopes);

  Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
  init.HttpClientInitializer = credential;
  init.ApplicationName = "My Test App";
  DriveService service = new DriveService(init);

入力されたIDのファイル名を取得します。IDからファイル情報を取得する場合は、DriveService オブジェクトの File.Get() メソッドを利用します。 メソッドの第一引数に取得したい要素のIDを与えます。ファイルの情報は Getメソッドの戻り値の Google.Apis.Drive.v3.Data.File オブジェクトで 取得できます。
  Google.Apis.Drive.v3.Data.File file = service.Files.Get(textBox1.Text).Execute();
  textBox2.Text += string.Format("ID:{0} のファイル情報を取得しました。 MimeType:{1}\r\n", file.Name, file.MimeType);

指定したIDのファイルをダウンロードします。初めに FilesResource.GetRequest オブジェクトを作成します。 作成したオブジェクトの Download() メソッドを呼び出します。Downloadメソッドの第一引数にダウンロードしたファイルを保存する FileStreamを与えます。FileStreamのコンストラクタのファイル保存パスはc:\dataディレクトリを指定します。ファイル名はダウンロードするファイルの Google Driveでのファイル名とします。また、ファイルのダウンロード後にはFileStreamをCloseします。
  FilesResource.GetRequest req = service.Files.Get(textBox1.Text);
  FileStream dfs = new FileStream("c:\\data\\"+ file.Name, FileMode.Create, FileAccess.Write);
  req.Download(dfs);
  dfs.Close();

実行結果

上記のプロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスにダウンロードするファイルのIDを入力します。入力後、[button1]をクリックします。


入力したIDのファイル情報を取得し、ファイルのダウンロードが実行されます。


ダウンロード先の c:\data ディレクトリを確認します。ファイルがダウンロードされていることが確認できます。

補足

Downloadメソッドは同期処理のため、ファイルをダウンロード中は制御が戻らないためUIがフリーズした状態になります。 ダウンロードするファイルサイズが大きい場合、時間がかかる場合はUIがフリーズしないようにするために、 非同期アップロード処理である、UploadAsync() メソッドを利用します。
コード例
    private async void button2_Click(object sender, EventArgs e)
    {
      FileStream fs = new FileStream("(JSONキーファイルのパス)", FileMode.Open, FileAccess.Read);
      Google.Apis.Auth.OAuth2.GoogleCredential credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromStream(fs).CreateScoped(Scopes);

      Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
      init.HttpClientInitializer = credential;
      init.ApplicationName = "My Test App";
      DriveService service = new DriveService(init);

      Google.Apis.Drive.v3.Data.File file = service.Files.Get(textBox1.Text).Execute();
      textBox2.Text += string.Format("ID:{0} のファイル情報を取得しました。 MimeType:{1}\r\n", file.Name, file.MimeType);

      FilesResource.GetRequest req = service.Files.Get(textBox1.Text);
      FileStream dfs = new FileStream("c:\\data\\" + file.Name, FileMode.Create, FileAccess.Write);
      await req.DownloadAsync(dfs);
      dfs.Close();

      textBox2.Text += "ファイルのダウンロードが完了しました。\r\n";
    }
このページのキーワード
  • Google Drive C# ダウンロード
  • Google Drive C# ファイル ダウンロード
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-07-29
iPentec all rights reserverd.