Använd OneDrive-API:et för att räkna upp fler än 200 objekt i en mapp

Sidan uppdaterad :
Datum för skapande av sida :

Operativ miljö

Visuell Studio
  • Visual Studio 2022
.NÄT
  • .NET 8
API för Microsoft-autentisering
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph (på engelska)
  • 5.68.0
Typer av Microsoft-konton
  • Arbets- eller skolkonto

Förutsättningar

Visuell Studio
  • En av versionerna
.NÄT
  • En av versionerna
API för Microsoft-autentisering
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph (på engelska)
  • 5.XX
Typer av Microsoft-konton
  • Arbets- eller skolkonto

Det maximala antalet objekt som kan hämtas samtidigt

När du hämtar innehållet i en mapp med OneDrive-API:et är det maximala antalet som kan hämtas samtidigt 200. Denna siffra kan också hittas på den officiella webbplatsen nedan.

Detta gäller även om du trycker direkt på URL:en, men Microsoft.Graph också om du använder biblioteket. Följande kod, som nämndes i föregående tips, hämtar bara upp till 200 resultat. Inga fel uppstår,DriveItemCollectionResponse.OdataNextLink men du kan kontrollera om det finns fler än 201 objekt genom att kontrollera om värdet för egenskapen har angetts.

// フォルダ内アイテム一覧取得
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}");
}

Om du vill få det via HTTP-begäran måste du @odata.nextLink komma åt URL:en för en efter en för att få den. Microsoft.Graph Om du använder biblioteket finns det ett enklare sätt att få tag på alla fler än 200 objekt. PageIterator Det finns en klass som heter , så allt du behöver göra är att använda den. Använd den på följande sätt:

// フォルダ内アイテム一覧取得
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();

När du har fått svaret på mappobjektlistan (DriveItemCollectionResponse) PageIterator.CreatePageIterator Ange det som det andra argumentet i metoden. Det tredje argumentet är ett återanrop, som anropas objekt för objekt, så om du listar det bör du kunna hämta alla objekt.

PageIterator.CreatePageIterator Förresten, genererar bara en iteration, så vi måste anropa metoden i slutet PageIterator.IterateAsync .