Usar a API do OneDrive para enumerar mais de 200 itens em uma pasta

Página atualizada :
Data de criação de página :

Ambiente operacional

Visual Studio
  • Visual Studio 2022
.REDE
  • .NET 8
API de Autenticação da Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.68.0
Tipos de contas da Microsoft
  • Conta corporativa ou de estudante

Pré-requisitos

Visual Studio
  • Uma das versões
.REDE
  • Uma das versões
API de Autenticação da Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.XX
Tipos de contas da Microsoft
  • Conta corporativa ou de estudante

O número máximo de itens que podem ser recuperados de uma vez

Ao recuperar o conteúdo de uma pasta com a API do OneDrive, o número máximo que pode ser recuperado de uma só vez é 200. Este número também pode ser encontrado no site oficial abaixo.

Isso é verdade mesmo se você acessar o URL diretamente, mas Microsoft.Graph também se usar a biblioteca. O código a seguir, mencionado nas dicas anteriores, recupera apenas até 200 resultados. Nenhum erro ocorrerá,DriveItemCollectionResponse.OdataNextLink mas você pode verificar se há mais de 201 itens verificando se o valor da propriedade está definido.

// フォルダ内アイテム一覧取得
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 você deseja obtê-lo por solicitação HTTP, você @odata.nextLink precisa acessar a URL de um por um para obtê-lo. Microsoft.Graph Se você estiver usando a biblioteca, há uma maneira mais fácil de obter mais de 200 itens. PageIterator Existe uma classe chamada , então tudo o que você precisa fazer é usá-la. Use-o da seguinte maneira:

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

Depois de obter a resposta da lista de itens da pasta (DriveItemCollectionResponse) PageIterator.CreatePageIterator Especifique-o como o segundo argumento do método. O terceiro argumento é um retorno de chamada, que é chamado item por item, portanto, se você listá-lo, poderá obter todos os itens.

PageIterator.CreatePageIterator A propósito, está apenas gerando uma iteração, então precisamos chamar o método no final PageIterator.IterateAsync .