読者です 読者をやめる 読者になる 読者になる

C#からOneDrive API(3) フォルダ・ファイル一覧の取得

C# UWP Xamarin OneDrive

あすかです。

前回はXamarinからOneDriveの認証をしてみました。

kmycode.hatenablog.jp

今回は、簡単なエクスプローラの作成を通して、特定のフォルダのファイルの一覧の取得に挑戦してみます。

OneDriveにおけるフォルダ・ファイルの操作

OneDriveでは、すべてのフォルダ・ファイルに、IDがつけられています。

f:id:kmynews:20170320104437p:plain

そして、OneDriveでは、パスではなくIDで操作することが基本になっています。
つまり、Dir3の中のファイル一覧を取得したい時は、まずDir3のIDを取得しなければいけません。

IDの取得にはどうすればいいのでしょうか。
ここで、(1)のときに作ったコードを再掲します。

var rootChildren = await this.client.Drive.Root.Children.Request().GetAsync();
この行は、Rootフォルダの子を取得する、という感じになっています。
そして、GetAsync()は、Itemのコレクションを返します。
Itemのプロパティに、上のコードにあるNameはもちろん、Idも入っています。このIdを使えばいいのです。

以下に、取得したIDを用いて、指定したIDの子フォルダ・ファイルを列挙するメソッドを記します。

9~11行目で、フォルダのIDが存在する場合、つまりRoot以外のフォルダを参照する場合は、client.Drive.Itemsに対してGetAsyncを実行しています。

実行してみる

簡単なエクスプローラを作ってみましたが、プログラム全体の構成はここで説明するにはちょっと複雑なので、気になる人はお手数ですがGitHubからソース見てください。

このような画面が出てきますので、フォルダを選んで移動します。

f:id:kmynews:20170320110403p:plain

すると、指定したフォルダの中身が表示されました。

f:id:kmynews:20170320110410p:plain

ItemWithPathを使ってパスから取得する

いちいちIDを見るのが面倒だっていうときは、普通にパスから取得することもできます。

最初からこっちにしろよ!ということですねそうですね(´・ω・`)

試しにItemWithPathを使った時と使わないときとで速度に差は出ないか調べてみました。

結果はこのようになりました。

ItemWithPathのみ:86622
IDと併用        :92291

あまり違いはないみたいですね。ItemWithPathのほうが便利な場面もあるかも!
でも、例えば特定フォルダ内にあるファイルを全部ダウンロードするときとかに、いちいち絶対パスを作らなくてもすぐ使えるIDがあるってのは、地味に便利じゃないかと思います。

まとめ

また尺が余りました。

今回のソースはここにあります。

github.com

次回はファイルの読み書きを実際に試してみます!