Utilitzar l'API del OneDrive per enumerar més de 200 elements d'una carpeta
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
.