前回に引き続き 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