Usare l'API di OneDrive per enumerare più di 200 elementi in una cartella
Ambiente operativo
- Studio visivo
-
- Studio visivo 2022
- .RETE
-
- .NET 8
- API di autenticazione Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Microsoft.Graph
-
- 5.68.0
- Tipi di account Microsoft
-
- Account aziendale o dell'istituto di istruzione
Prerequisiti
- Studio visivo
-
- Una delle versioni
- .RETE
-
- Una delle versioni
- API di autenticazione Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Microsoft.Graph
-
- 5.XX
- Tipi di account Microsoft
-
- Account aziendale o dell'istituto di istruzione
Il numero massimo di elementi che possono essere recuperati contemporaneamente
Quando si recupera il contenuto di una cartella con l'API OneDrive, il numero massimo che può essere recuperato contemporaneamente è 200. Questa cifra può essere trovata anche sul sito ufficiale qui sotto.
Questo vale anche se si preme direttamente l'URL, ma Microsoft.Graph
anche se si utilizza la libreria.
Il codice seguente, menzionato nei suggerimenti precedenti, recupera solo fino a 200 risultati.
Non si verificheranno errori,DriveItemCollectionResponse.OdataNextLink
ma è possibile verificare se sono presenti più di 201 elementi controllando se il valore della proprietà è impostato.
// フォルダ内アイテム一覧取得
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}");
}
Se vuoi ottenerlo tramite richiesta HTTP, devi @odata.nextLink
accedere all'URL di uno per uno per ottenerlo.
Microsoft.Graph
Se stai utilizzando la libreria, c'è un modo più semplice per ottenere tutti gli oltre 200 elementi.
PageIterator
C'è una classe chiamata , quindi tutto quello che devi fare è usarla. Usalo come segue:
// フォルダ内アイテム一覧取得
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();
Una volta ottenuta la risposta dell'elenco degli elementi della cartella (DriveItemCollectionResponse
)
PageIterator.CreatePageIterator
Specificarlo come secondo argomento del metodo.
Il terzo argomento è un callback, che viene chiamato elemento per elemento, quindi se lo elenchi, dovresti essere in grado di ottenere tutti gli elementi.
PageIterator.CreatePageIterator
A proposito, sta solo generando un'iterazione, quindi dobbiamo chiamare il metodo alla fine PageIterator.IterateAsync
.