概要
前回、[C#] Google Drive API v3を使ってGoogle Slidesを取得するを投稿したのですが、特定のフォルダ下のファイルだけダウンロードしたい時があったので備忘録としてまとめてみました。
特定のフォルダ下にあるファイルをダウンロードする
Google Drive APIでは、フォルダ含め全てのファイル再帰的に取ってきてしまうため、特定のフォルダ下にあるファイルだけが欲しい場合はリクエストパラメータのクエリ構文で指定する必要があります。
つまり、特定のフォルダIDと親フォルダのIDが一致するファイルだけを取得するように指定することが必要です。
ユーザー認証やDrive API serviceを生成する過程はGoogle Drive APIs .NET Quickstartを参照。
クエリ構文で指定するファイルの属性の一覧はGoogle Drive APIs Search for Files and Team Drivesを参照。
// フォルダ「HogeFolder」下のファイル一覧を取得する
// リクエストパラメータの定義
// service(DriveService)はユーザ認証部分なので割愛
var listRequest = service.Files.List();
listRequest.PageSize = 1;
// 取得するフォルダの条件をクエリ構文で指定
listRequest.Q = "(name = 'HogeFolder') and (mimeType = 'application/vnd.google-apps.folder') and (trashed = false)";
listRequest.Fields = "nextPageToken, files(id)";
// フォルダIDの取得
var folderId = listRequest.Execute().Files.First().Id;
// フォルダ「HogeFolder」下のファイルの条件をクエリ構文で指定
// '{folderId}' in parentsにより、フォルダ「HogeFolder」下にあるファイルとフォルダのみが対象となる
listRequest.Q = $"('{folderId}' in parents) and (mimeType != 'application/vnd.google-apps.folder') and (trashed = false)";
listRequest.Fields = "nextPageToken, files(id, name)";
// ファイル一覧の取得
var files = listRequest.Execute().Files;
// 一番最初にとれたファイルのIDを取得する
var id = files.First().Id;
// 保存するファイル先を指定する
string saveTo = "HogeFolder";
// ファイルをダウンロードする
var request = service.Files.Get(id);
var filest = new System.IO.FileStream(Path.Combine(saveTo, files.First().Name), System.IO.FileMode.Create, System.IO.FileAccess.Write);
request.Download(filest);
参考