PG.Lib

主にUWP、C#に関することやガジェット系

ストアアプリで OneDrive からファイルを取得する

前回に引き続き OneDrive ネタ。

ログイン、保存 と来たので、次は保存したファイルの取得、読み込み。

◆ファイルID取得

大前提として、OneDrive上に保存されているファイルは、ファイル名ではアクセスできず、一意なファイルIDやフォルダIDを使用してアクセスする。

ファイルID、フォルダIDは保存したときのresultに含まれているらしいが、ユニバーサルアプリを考えたら使えないので、ファイル名からファイルIDを取得する。

    public static async Task<string> GetFileId(string strFileName)
    {
        string strRtn = string.Empty;
        try
        {
            // OneDrive直下のファイル、フォルダ一覧取得
            var operation = await liveClient.GetAsync("/me/skydrive" + "/files");

            if (operation == null) return string.Empty;

            // 結果取得
            dynamic data = ((dynamic)operation.Result).data;

            foreach (var row in data)
            {
                // 名前が一致したら
                if (((dynamic)row).name == strFileName)
                {
                    // IDを取得
                    strRtn = ((dynamic)row).id.ToString();
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            //エラー処理
        }
        return strRtn;
    }

ポイントは /files をつけること。

これでファイル、フォルダ一覧が取得できる。

フォルダの場合は、Type のプロパティが folder になっているので、ここでフォルダIDを取ることもできるね。

/me/skydrive をフォルダIDに変えれば、該当フォルダ内を見ることもできるのかな?

 

◆ファイル取得

ファイルIDが取れればあとはストリームでさくっと取得。

    public static async Task<string> Load(string strFileID)
    {
        string strRtn = string.Empty;

        try
        {
            // ファイルIDからデータを取得
            LiveDownloadOperation operation = await liveClient.CreateBackgroundDownloadAsync(strFileID + "/content/");

            // 結果を取得
            LiveDownloadOperationResult result = await operation.StartAsync();

            if (result != null)
            {
                using (var stream = result.Stream.AsStreamForRead(0))
                {
                    using(var reader = new StreamReader(stream))
                    {
                        // 読み込み
                        strRtn = await reader.ReadToEndAsync();
                    }
                }
            }
            else
            {
            }
        }
        catch (Exception ex)
        {
            //エラー処理
        }
        return strRtn;
    }

ここでのポイントは /content/ 。

保存したのがテキストなので、文字列で取得してデシリアライズして使う。

 

◆まとめ

何回かに分けて、OneDriveの操作を書いてみた。

エラー処理とかかなり甘く書いてるので、使う場合は補完してほしい。

ユニバーサルアプリが作れるようになって、ますますローミングの活躍の場が増えるだろうけど、容量制限もあるので、OneDrive経由で共有ってのは使える場面が多いと思う。

 

◆参考

http://zatsugaku.info/cryearth/?p=518

http://msdn.microsoft.com/ja-jp/library/windows/apps/jj680723.aspx

http://msdn.microsoft.com/ja-jp/library/windows/apps/hh826531.aspx