Использование API OneDrive для перечисления более 200 элементов в папке

Страница обновлена :
Дата создания страницы :

Операционная среда

Визуальная студия
  • Визуальная студия 2022
.СЕТЬ
  • .NET 8
API проверки подлинности Майкрософт
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Веб-сайт Microsoft.Graph
  • 5.68.0
Типы учетных записей Майкрософт
  • Рабочий или учебный аккаунт

Необходимые условия

Визуальная студия
  • Одна из версий
.СЕТЬ
  • Одна из версий
API проверки подлинности Майкрософт
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Веб-сайт Microsoft.Graph
  • 5.ХХ
Типы учетных записей Майкрософт
  • Рабочий или учебный аккаунт

Максимальное количество элементов, которые могут быть извлечены за один раз

При получении содержимого папки с помощью API OneDrive максимальное число, которое можно получить за один раз, равно 200. С этой цифрой также можно ознакомиться на официальном сайте ниже.

Это верно даже при прямом нажатии на URL-адрес, Microsoft.Graph а также при использовании библиотеки. Следующий код, который упоминался в предыдущих советах, извлекает только до 200 результатов. Ошибок не произойдет, но вы можете проверить,DriveItemCollectionResponse.OdataNextLink есть ли больше 201 элемента, проверив, задано ли значение свойства.

// フォルダ内アイテム一覧取得
var folderChildren = await graphClient.Drives[drive.Id].Items[folderItem.Id].Children.GetAsync();
if (folderChildren == null || folderChildren.Value == null)
{
  Console.WriteLine("フォルダの一覧を取得できませんでした。");
  return;
}
foreach (var item in folderChildren.Value)
{
  Console.WriteLine($"Type={(item.File != null ? "File" : "Folder")}, Id={item.Id}, Name={item.Name}, Size={item.Size}");
}

Если вы хотите получить его с помощью HTTP-запроса, вам @odata.nextLink нужно получить доступ к URL-адресу одного за другим, чтобы получить его. Microsoft.Graph Если вы используете библиотеку, есть более простой способ получить все более 200 элементов. PageIterator Есть класс под названием , так что все, что вам нужно сделать, это использовать его. Используйте его следующим образом:

// フォルダ内アイテム一覧取得
var folderChildren = await graphClient.Drives[drive.Id].Items[folderItem.Id].Children.GetAsync();
if (folderChildren == null || folderChildren.Value == null)
{
  Console.WriteLine("フォルダの一覧を取得できませんでした。");
  return;
}

var pageIterator = PageIterator<DriveItem, DriveItemCollectionResponse>.CreatePageIterator(
      graphClient,
      folderChildren,
      (item) =>
      {
        Console.WriteLine($"Type={(item.File != null ? "File" : "Folder")}, Id={item.Id}, Name={item.Name}, Size={item.Size}");
        return true;  // false を返すまで次のアイテムを列挙します
      });
await pageIterator.IterateAsync();

Как только вы получите ответ со списком элементов папки (DriveItemCollectionResponse) PageIterator.CreatePageIterator Укажите его в качестве второго аргумента метода. Третий аргумент — это обратный вызов, который вызывается для каждого элемента отдельно, поэтому, если вы перечислите его, вы сможете получить все элементы.

PageIterator.CreatePageIterator Кстати, это всего лишь генерация итерации, поэтому нам нужно вызвать метод в конце PageIterator.IterateAsync .