今回はいよいよ unity プロジェクトから Google Drive ファイルにアクセスします。
前回の記事で下準備が終わっている人向けの記事です。
前回の記事 >> GoogleDrive でファイルを読み書きする準備
unity プロジェクトを作成
unity2018 以降であれば特にバージョンは問題ないと思います(私は 2019 で確認しました)。
Package Manager で + > Add package from git URL...
を選択、https://github.com/Elringus/UnityGoogleDrive.git#package を Add します。
Edit > Project Settings... > Google Drive > Parse generic credentials JSON file...
を選択、前回の記事で作成した json ファイルをインポートします。
Generic Credentials に情報が入れば成功。これでアクセスするための準備は整いました。
Google Drive のファイルアクセスについて
Google Drive のファイルは PC のファイルとは異なります。
どちらかというとデータベースと思った方が理解は速いかもしれません。
同名のファイルをいくつでも作れる
Google Drive のファイルは「ファイル名ではなくファイルID」で管理されています。
このため、同名のファイルがいくつでも存在出来てしまいます。
直接パス指定でファイルアクセスすることはできない
例えば CreateFile("/Folder1/Folder2/File") のようなアクセスはできません。
同等の処理を行う場合、Folder2 を検索する > Folder2 のファイル ID を親として File を作成する
、といったひと手間が必要です。
取得するファイル情報は自分で決める
これは言い換えれば「どの情報が欲しいか明示する必要がある」ということです。
例えば以下のように指定した場合、ファイル名やファイルサイズは取得できません。
var request = GoogleDriveFiles.List(); request.Fields = new List { "files(id, mimeType, createdTime)" }; // こちらなら、名前とサイズを取得できる //request.Fields = new List { "files(id, name, size, mimeType, createdTime)" };
アクセスするためのコードサンプル
①ファイル名からファイルIDを取得する (List)
ファイル操作にはファイル ID が必要ですが、まずはファイル名からファイル情報を取得し、そのメンバであるファイル ID を使って処理する必要があります。
使い方ですが、SQL の SELECT コマンドをイメージしておくと理解しやすいと思います。
var reqfiles = GoogleDriveFiles.List(); reqfiles.Fields = new List<string> { "files(id, name, size, mimeType, createdTime)" }; reqfiles.Q = $"name = \'filename\'"; reqfiles.Send().OnDone += (filelist) => { foreach (var file in filelist.Files) { Debug.Log($"{file.Name}"); } };
フォルダについては Google Drive の URL でも確かめることができます。
ただし、同じ名前が同じ ID とは限らないので、URL で ID を確認するのはやめておいた方が無難です。
https://drive.google.com/drive/u/3/folders/XXXXXXXXXX
取得する情報を指定する
PC のファイル情報のように、検索すれば全て取得できるわけではありません。
また、情報が少ないほどアクセスも速くなるので、なるべく限定した方がいいでしょう。
request.Fields = new List<string> { "files(id, name, size, mimeType, createdTime)" };
mimeType 以外は大体想像つくかと思いますが、mimeType でフォルダ or ファイルを区別します。
その他、どのような情報が取得できるかについては、公式を参照してください。
検索を厳密に行う
先ほど紹介したように「同名のファイルはいくつでも作れる」ため、返ってくる結果が複数になるのは珍しくありません。
特に上の例だと、ゴミ箱に入っているファイルも全部取ってくるし、フォルダとファイルの区別もしていません。
それらの問題を解消した reqfiles.Q はこのようになります。
request.Q = $"name = \'{foldername}\' and mimeType = 'application/vnd.google-apps.folder' and trashed = false"; // フォルダ request.Q = $"name = \'{filename}\' and mimeType != 'application/vnd.google-apps.folder' and trashed = false"; // ファイル
ファイルかフォルダの区別は mimeType で確認します。
trashed がゴミ箱です。trashed = false にすると「ゴミ箱以外」を検索してくれます。
条件式は他にもあります。公式を参照してください。
OnDone はコマンド終了時のイベント
reqfiles.Send() は非同期で実行されます。その終了を検知するためのイベントが OnDone です。
これから紹介する全てのコマンドに OnDone が存在します。
返ってくる情報にはエラー情報もありますので、そのハンドリングも重要です。
②ファイルリストを取得する (List)
var reqfiles = GoogleDriveFiles.List(); reqfiles.Fields = new List<string> { "files(id, name, size, mimeType, createdTime)" }; reqfiles.Q = $"\'{XXXXXXXXXX}\' in parents and trashed = false"; reqfiles.Send().OnDone += (filelist) => { foreach (var file in filelist.Files) { Debug.Log($"{file.Name}"); } };
指定したフォルダ ID のファイル一覧を取得します。XXXXXXXXXX はフォルダ ID です(①で取得します)。
①と比べて、Q の部分しか違いはありません。
③ファイルを新規作成する (Create)
byte[] data = System.Text.Encoding.UTF8.GetBytes("0123456789"); UnityGoogleDrive.Data.File file = new UnityGoogleDrive.Data.File(); file.Name = filename; file.Content = data; // 親フォルダの指定 //file.Parents = new List<string>(); //file.Parents.Add(folderId); // フォルダの場合、"application/vnd.google-apps.folder" //file.MimeType = mimeType; var request = GoogleDriveFiles.Create(file); request.Send().OnDone += (response) => { if (request.IsError == true) { Debug.LogError(request.Error); } else { Debug.Log($"created: {request.ResponseData.Name} ID[request.ResponseData.Id]"); } };
ファイルを新規作成します。
このコマンドは新規作成のみであり、ファイルの更新は行えません。
複数回 Create すると、同じ名前のファイルがどんどん増えていきます。
④ファイルを更新する (update)
byte[] data = System.Text.Encoding.UTF8.GetBytes("abcdefghij"); UnityGoogleDrive.Data.File file = new UnityGoogleDrive.Data.File(); file.Content = data; // fileId は①で取得しておくこと var request = GoogleDriveFiles.Update(fileId, file); request.Send().OnDone += (response) => { if (request.IsError == true) { Debug.LogError(request.Error); } else { Debug.Log($"updated: {request.ResponseData.Name} ID[request.ResponseData.Id]"); } };
ファイルIDを指定して、既にあるファイルを更新します。
⑤ファイルを読み込む (Download)
// fileId は①で取得しておくこと var request = GoogleDriveFiles.Download(fileId); request.Send().OnDone += (file) => { if (request.IsError == true) { Debug.LogError(request.Error); } else { var text = System.Text.Encoding.UTF8.GetString(file.Content); Debug.Log($"read: '{text}'"); } };
ファイルIDを指定して、ファイルを読み込みます。
例はテキストファイルです。
⑥ファイルを削除する (Delete)
// fileId は①で取得しておくこと var request = GoogleDriveFiles.Delete(fileId); request.Send().OnDone += (file) => { if (request.IsError == true) { Debug.LogError(request.Error); } else { Debug.Log($"deleted: ID[fileId]"); } };
ファイルIDを指定して、ファイルを削除します。