Box はクラウドストレージサービスの一つです。Boxにはフォルダ、ファイル管理のための便利なツールが揃っており、APIとそのSDKもあります。Box APIにはあるフォルダの中にあるファイルとフォルダの一覧を取得するなどの多くのファイル、フォルダをまとめて取得するAPIがあります。これらのAPIは便利なのですが、デフォルトの状態ではAPIから返される情報が少々心もとないです。この情報を増やす方法を紹介します。
まず基本的なフォルダ内のファイル・フォルダ一覧を取得するコードが次です。BoxClientインスタンスの作り方についてはBox Developerドキュメントの.NET SDKについてのチュートリアルが詳しいです。
/// <summary>
/// 指定したフォルダIDのフォルダ内の一覧を取得します。
/// </summary>
/// <param name="client">BoxAPIクライアント</param>
/// <param name="folderId">画面出力するフォルダのID</param>
/// <returns>結果の完了を表すTask</returns>
public async Task<BoxCollection<BoxItem>> GetItemList(BoxClient client, string folderId)
{
const int limit = 1000; // 1回のリクエストで取得するアイテムの最大数
// APIを呼び出してフォルダのアイテムを取得
return await client.FoldersManager.GetFolderItemsAsync(folderId, limit);
}
これでフォルダ内のファイルとフォルダの一覧を取得できます。しかしながらこの一覧に含まれる情報は簡素であり、しばしば追加の情報が欲しい時があります。これは次のようにできます。
/// <summary>
/// 指定したフォルダIDのフォルダ内の一覧を取得します。
/// </summary>
/// <param name="client">BoxAPIクライアント</param>
/// <param name="folderId">画面出力するフォルダのID</param>
/// <returns>結果の完了を表すTask</returns>
public async Task<BoxCollection<BoxItem>> GetItemList(BoxClient client, string folderId)
{
const int limit = 1000; // 1回のリクエストで取得するアイテムの最大数
var fields = new List<string>() { "name", "type", "id", "created_at" }; // 取得するアイテムのフィールド
// APIを呼び出してフォルダのアイテムを取得
return await client.FoldersManager.GetFolderItemsAsync(folderId, limit, fields: fields);
}
引数のfieldsではどのプロパティの値を取得するかを制御できます。恐らく通信量やメモリとの兼ね合いでデフォルトでは取得されるプロパティが小さなものになっているのだと思います。fieldsパラメータはこれを無視する形で独自に返して欲しいプロパティを決めます。SQLでいうSELECTみたいなものです。参照可能なプロパティはリファレンスの次の部分にまとまっています。ここにある欲しいプロパティの名前をfieldsに入れて一覧APIから得られるか否かを試し、得られるならばそれを使うといった具合です。
ファイル (Full) – APIリファレンス – Box Developerドキュメント
フォルダ (Full) – APIリファレンス – Box Developerドキュメント
本題とはずれますがBoxAPIでは全件取得ができません。1000件までです。ですので上記のコードにはさらにページネーションを加える必要があります。これは次のようにできます。
/// <summary>
/// 指定したフォルダIDのフォルダ内の一覧を取得します。
/// </summary>
/// <param name="client">BoxAPIクライアント</param>
/// <param name="folderId">画面出力するフォルダのID</param>
/// <returns>結果の完了を表すTask</returns>
public async Task<List<BoxItem>> GetItemList(BoxClient client, string folderId)
{
const int limit = 1000; // 1回のリクエストで取得するアイテムの最大数
var fields = new List<string>() { "name", "type", "id", "created_at" }; // 取得するアイテムのフィールド
var allItems = new List<BoxItem>();
int offset = 0;
do
{
// APIを呼び出してフォルダのアイテムを取得
var response = await client.FoldersManager.GetFolderItemsAsync(folderId, limit, offset, fields);
allItems.AddRange(response.Entries);
offset += limit;
}
while (offset < allItems.Count);
return allItems;
}
do whileを使って取得した後に続きがあるならもう一回取得、というのを繰り返させるわけです。これでフォルダの中のファイルやフォルダをほぼ全件取得できます。ほぼというのはoffsetについて上限が10000という記述がBoxAPIのリファレンスに見受けられるためです。1フォルダ内のファイルやフォルダの数が11000を超えたら上記のような全件取得ができなくなるやもしれません。もしその様な場合でも全件取得をしたい場合はSDKに頼らず、直にファイルやフォルダの一覧取得APIを叩いてmarkerによるページネーションを使えるようにする必要があるでしょう。