2013/01/08

[C#]Google Driveに新しいディレクトリを作る

,
 Google APIs Client Library for .NETで遊んでみました。このライブラリは、色々な言語のものが用意されてますね、びっくりです。後あまり他にやってる人を見ないので、日本語のページが少なくて辛いです…

 で、まずはGoogle Driveにファイルをアップロードする(Google先生曰くこれがHello, World!らしい)ところから始めます。Google Drive SDK — Google DevelopersのQuickstart: Run a Drive App in Javaを見てやってみましょう。という話。

フォルダはどうやって表されているの?

とりあえずQuickstartは動いたので、次にフォルダを作ってみます。Google Driveでフォルダはどうやって表されてるの?ということで、貴重な日本語公式資料のファイルとフォルダを操作する - Google デベロッパー アカデミー — Google Developersによると、『フォルダとは、MIME タイプが application/vnd.google-apps.folder で、拡張子を持たないファイルです。』らしいです。

 えっ………ファイル………………?


とりあえずフォルダを作ってみる

※以下Quickstartのコードのファイルアップロードするところだけをちょこまかといじってます。認証部とかはそのままにしてます。

 見なかったことにしてネットの海でコードを探します。c# - upload an Image to a created folder in Google drive account - Stack Overflowを見るところによれば、ファイルを作る場合、Quickstartにも似たようなコードが出てきたように、Fileクラスのインスタンスは
     
//ファイルのひな形を作る感じ
File body = new File();
body.Title = "My document";
body.Description = "A test document";
body.MimeType = "text/plain";

//ファイルの中身を書き込む…?
byte[] byteArray = System.IO.File.ReadAllBytes("document.txt");
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);

//アップロードする
FilesResource.InsertMediaUpload request = 
service.Files.Insert(body, stream, "text/plain");
request.Upload();

//アップロードされたファイルのIdを取得しておく
File file = request.ResponseBody;
Console.WriteLine("File id: " + file.Id);

のように設定してアップロードします。ですが、フォルダを作成する場合には、
            
//フォルダを作る
File folder = new File();
folder.Title = "myfolder2";
folder.Description = "my folder description";
//フォルダなのでMimeTypeはこれ
folder.MimeType = "application/vnd.google-apps.folder";

//アップロード
File file = service.Files.Insert(folder).Fetch();
Console.WriteLine("folder id : " + file.Id);

という風にすると、フォルダが作成できるみたいです。ちゃんとMime Typeがapplication/vnd.google-apps.folderになってますね。

 アップロードの手順も違っていますが、何か意味があるんでしょうか…(動いたからとりあえず違いに目を瞑っている)

動きました
ま、とにかくこれでフォルダが作れることがわかりました。


親フォルダを指定してファイルをアップロードする


 はてさて。親フォルダを指定する場合はどうすればいいんでしょう?上に紹介したリンク先のコードにある通り、
string parentId = "";//親フォルダのId
File file = new File();
//...
file.Parents = new List<parentreference>()
   { new ParentReference() {Id = parentId} };

とします。ですが親フォルダのIdが分からないので、フォルダを検索してIdを取得してこないといけません。検索はどうやってするんだ…?

 Search for Files Google Drive SDK — Google Developersより、Files.listを使えばいいらしいので、Files: list - Google Drive SDK — Google Developersのサンプルコードを実行してみます。
 ここでは、フォルダだけを表示するために、Query = "mimeType = 'application/vnd.google-apps.folder'"としています。クエリの詳細は上のSearch for Filesを見てください。便利ですねこれ。
//フォルダのみを選ぶクエリ
string query = "mimeType = 'application/vnd.google-apps.folder'";
List<file> result = new List<file>();
FilesResource.ListRequest req = service.Files.List();
req.Q = query; //クエリを使わない(全ファイル、フォルダを表示)時は削除

do
{
      try
      {
            FileList files = req.Fetch();
            result.AddRange(files.Items);
            req.PageToken = files.NextPageToken;
       }
       catch (Exception e)
       {
            Console.WriteLine("An error occurred:" + e.Message);
            req.PageToken = null;
        }
 } while (!String.IsNullOrEmpty(req.PageToken));
            
 //検索結果を見てみよう
foreach (File f in result)
{
       Console.WriteLine("File name :" + f.Title + " id :" + f.Id);
}

 すると、コンソールにフォルダ名とIdが出てきたと思います。これで準備は整いましたね。さっき作ったmyfolder2にdocument.txtをアップロードする場合は、

//まずフォルダ名がmyfolder2なものを検索
string query = "title = 'myfolder2'";
List<File> result = new List<File>();
FilesResource.ListRequest req = service.Files.List();
req.Q = query;

do
{
      try
      {
            FileList files = req.Fetch();
            result.AddRange(files.Items);
            req.PageToken = files.NextPageToken;
       }
       catch (Exception e)
       {
            Console.WriteLine("An error occurred:" + e.Message);
            req.PageToken = null;
        }
 } while (!String.IsNullOrEmpty(req.PageToken));

//親フォルダのIdをコピっとく
string parentId = "";
foreach (File f in result)
{
    parentId = f.Id;
}

//ファイルをアップロードします
File body = new File();
body.Title = "My document";
body.Description = "A test document";
body.MimeType = "text/plain";
body.Parents = new List<ParentReference>(){
    new ParentReference() { Id = parentId } 
};

byte[] byteArray = System.IO.File.ReadAllBytes("document.txt");
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);

FilesResource.InsertMediaUpload request =
        service.Files.Insert(body, stream, "text/plain");
request.Upload();

File file = request.ResponseBody;
Console.WriteLine("File id: " + file.Id);
Console.WriteLine("Press Enter to end this process.");
Console.ReadLine();
とすればいいみたいです(エラー処理はしてないので各自で)。めでたしめでたし。

 3日前くらいにつまったのですが、なんとか解決したので良かったです。しかし、いちいちAuthorization Codeをコピペするのは面倒なんですが…ココらへんを参考にして、どうにかしたいですね。
 後、記事が無駄に長くなっちゃって、もう少し見栄え良く読みやすい記事を書けないものかと思います…

おまけ


 SyntaxHighlighterで<や>を使う場合には、HTML Escapeしないといけないんですね。<なら&lt;に。>なら&gt;に。です。
 
 まあBloggerの場合は、コードをHTML編集で貼り付けると、InvalidなHTMLは認めないらしくてList<File>と書くと勝手に</File>してくれます。凄い…凄いけどいらない…

0 コメント to “[C#]Google Driveに新しいディレクトリを作る”

コメントを投稿