Використовуйте API OneDrive для нумерації понад 200 елементів у папці

Сторінка оновлюється :
Дата створення сторінки :

Робоче середовище

Візуальна студія
  • Visual Studio 2022
.МЕРЕЖІ
  • .NET 8
API автентифікації Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.68.0
Типи облікових записів Microsoft
  • Робочий або навчальний обліковий запис

Передумови

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

Максимальна кількість предметів, яку можна отримати за один раз

Під час отримання вмісту папки за допомогою 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 .