Utilitzar l'API del OneDrive per enumerar més de 200 elements d'una carpeta

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn operatiu

Visual Studio
  • Visual Studio 2022
.XARXA
  • .NET 8
API d'autenticació de Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.68.0
Tipus de comptes de Microsoft
  • Compte de la feina o d'un centre educatiu

Prerequisits

Visual Studio
  • Una de les versions
.XARXA
  • Una de les versions
API d'autenticació de Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.XX
Tipus de comptes de Microsoft
  • Compte de la feina o d'un centre educatiu

El nombre màxim d'elements que es poden recuperar alhora

Quan es recupera el contingut d'una carpeta amb l'API del OneDrive, el nombre màxim que es pot recuperar alhora és 200. Aquesta xifra també es pot trobar al lloc web oficial a continuació.

Això és cert fins i tot si premeu l'URL directament, però Microsoft.Graph també si utilitzeu la biblioteca. El codi següent, que s'ha esmentat en els consells anteriors, només recupera fins a 200 resultats. No es produiran errors,DriveItemCollectionResponse.OdataNextLink però podeu comprovar si hi ha més de 201 elements comprovant si el valor de la propietat està definit.

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

Si voleu obtenir-lo per sol·licitud HTTP, heu @odata.nextLink d'accedir a l'URL d'un per un per aconseguir-lo. Microsoft.Graph Si utilitzeu la biblioteca, hi ha una manera més senzilla d'obtenir tots els més de 200 elements. PageIterator Hi ha una classe anomenada , així que tot el que has de fer és utilitzar-la. Utilitzeu-lo de la següent manera:

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

Un cop obtingueu la resposta de la llista d'elements de la carpeta (DriveItemCollectionResponse) PageIterator.CreatePageIterator Especifiqueu-lo com el segon argument del mètode. El tercer argument és una devolució de trucada, que es crida element per element, de manera que si l'enumereu, hauríeu de poder obtenir tots els elements.

PageIterator.CreatePageIterator Per cert, només està generant una iteració, de manera que hem de cridar el mètode al final PageIterator.IterateAsync .