Usar la API de OneDrive para enumerar más de 200 elementos en una carpeta

Actualización de la página :
Fecha de creación de la página :

Entorno operativo

Estudio visual
  • Visual Studio 2022
.RED
  • .NET 8
API de autenticación de Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.68.0
Tipos de cuentas de Microsoft
  • Cuenta profesional o educativa

Prerrequisitos

Estudio visual
  • Una de las versiones
.RED
  • Una de las versiones
API de autenticación de Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft.Graph
  • 5.XX
Tipos de cuentas de Microsoft
  • Cuenta profesional o educativa

El número máximo de elementos que se pueden recuperar a la vez

Al recuperar el contenido de una carpeta con la API de OneDrive, el número máximo que se puede recuperar a la vez es 200. Esta cifra también se puede encontrar en el sitio web oficial a continuación.

Esto es cierto incluso si presiona la URL directamente, pero Microsoft.Graph también si usa la biblioteca. El siguiente código, que se mencionó en los consejos anteriores, solo recupera hasta 200 resultados. No se producirá ningún error,DriveItemCollectionResponse.OdataNextLink pero puede comprobar si hay más de 201 elementos comprobando si se ha establecido el valor de la propiedad.

// フォルダ内アイテム一覧取得
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 desea obtenerlo por solicitud HTTP, debe @odata.nextLink acceder a la URL de uno por uno para obtenerlo. Microsoft.Graph Si está utilizando la biblioteca, hay una manera más fácil de obtener los más de 200 elementos. PageIterator Hay una clase llamada , así que todo lo que tienes que hacer es usarla. Úselo de la siguiente 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();

Una vez que obtenga la respuesta de la lista de elementos de la carpeta (DriveItemCollectionResponse) PageIterator.CreatePageIterator Especifíquelo como el segundo argumento del método. El tercer argumento es una devolución de llamada, a la que se llama elemento por elemento, por lo que si lo enumera, debería poder obtener todos los elementos.

PageIterator.CreatePageIterator Por cierto, solo está generando una iteración, por lo que debemos llamar al método al final PageIterator.IterateAsync .