[unity 2022年度版]GoogleDrive でファイルを読み書きするコード

今回はいよいよ 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を指定して、ファイルを削除します。

次の記事

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA