Sử dụng API OneDrive để liệt kê hơn 200 mục trong một thư mục
Môi trường hoạt động
- Visual Studio
-
- Visual Studio 2022
- .MẠNG
-
- .NET 8
- API xác thực Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Microsoft.Graph
-
- 5.68.0
- Các loại tài khoản Microsoft
-
- Tài khoản cơ quan hoặc trường học
Điều kiện tiên quyết
- Visual Studio
-
- Một trong những phiên bản
- .MẠNG
-
- Một trong những phiên bản
- API xác thực Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Microsoft.Graph
-
- 5.XX
- Các loại tài khoản Microsoft
-
- Tài khoản cơ quan hoặc trường học
Số lượng mục tối đa có thể được truy xuất cùng một lúc
Khi truy xuất nội dung của thư mục bằng API OneDrive, số lượng tối đa có thể được truy xuất cùng một lúc là 200. Con số này cũng có thể được tìm thấy trên trang web chính thức bên dưới.
Điều này đúng ngay cả khi bạn nhấn trực tiếp vào URL, nhưng Microsoft.Graph
cũng nếu bạn sử dụng thư viện.
Mã sau, đã được đề cập trong các mẹo trước, chỉ truy xuất tối đa 200 kết quả.
Sẽ không có lỗi nào xảy ra,DriveItemCollectionResponse.OdataNextLink
nhưng bạn có thể kiểm tra xem có nhiều hơn 201 mục hay không bằng cách kiểm tra xem giá trị của thuộc tính đã được đặt hay chưa.
// フォルダ内アイテム一覧取得
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}");
}
Nếu bạn muốn lấy nó bằng yêu cầu HTTP, bạn @odata.nextLink
cần truy cập URL của từng cái một để lấy nó.
Microsoft.Graph
Nếu bạn đang sử dụng thư viện, có một cách dễ dàng hơn để lấy tất cả hơn 200 mục.
PageIterator
Có một lớp gọi là , vì vậy tất cả những gì bạn phải làm là sử dụng nó. Sử dụng nó như sau:
// フォルダ内アイテム一覧取得
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();
Khi bạn nhận được phản hồi danh sách mục thư mục (DriveItemCollectionResponse
)
PageIterator.CreatePageIterator
Chỉ định nó làm đối số thứ hai của phương thức.
Đối số thứ ba là một callback, được gọi trên cơ sở từng mục, vì vậy nếu bạn liệt kê nó, bạn sẽ có thể lấy tất cả các mục.
PageIterator.CreatePageIterator
Nhân tiện, chỉ tạo ra một lần lặp lại, vì vậy chúng ta cần gọi phương thức ở cuối PageIterator.IterateAsync
.