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