C#からOneDrive API(3) フォルダ・ファイル一覧の取得
あすかです。
前回はXamarinからOneDriveの認証をしてみました。
今回は、簡単なエクスプローラの作成を通して、特定のフォルダのファイルの一覧の取得に挑戦してみます。
OneDriveにおけるフォルダ・ファイルの操作
OneDriveでは、すべてのフォルダ・ファイルに、IDがつけられています。
そして、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からソース見てください。
このような画面が出てきますので、フォルダを選んで移動します。
すると、指定したフォルダの中身が表示されました。
ItemWithPathを使ってパスから取得する
いちいちIDを見るのが面倒だっていうときは、普通にパスから取得することもできます。
最初からこっちにしろよ!ということですねそうですね(´・ω・`)
試しにItemWithPath
を使った時と使わないときとで速度に差は出ないか調べてみました。
結果はこのようになりました。
ItemWithPathのみ:86622 IDと併用 :92291
あまり違いはないみたいですね。ItemWithPath
のほうが便利な場面もあるかも!
でも、例えば特定フォルダ内にあるファイルを全部ダウンロードするときとかに、いちいち絶対パスを作らなくてもすぐ使えるIDがあるってのは、地味に便利じゃないかと思います。