我需要一些简单的东西,但是已经花了很多时间并且还没有成功,所以我想获取给定驱动器中的所有文件名(其中一个用户,我以admin身份登录),我将自己扩展用于递归的解决方案,为使事情变得简单,我们假设在此结构中只有以下文件:
/root/someFolder/someFile.txt
/root/file2.txt
我想要输出:
someFile.txt
file2.txt
我的代码是:
var res = await GraphClient.Users["user3@myCompanyName.onmicrosoft.com"].Drive.Root.Children.Request().GetAsync();
foreach (DriveItem p in res.CurrentPage)
Console.WriteLine(p.Name);
输出:
someFolder
file2.txt
那不是我需要的输出
答案 0 :(得分:0)
这是预期的行为,因为端点GET https://graph.microsoft.com/v1.0/me/drive/root/children
仅在项目下面返回一个级别,因此要检索所有项目,需要显式检索子文件夹项目,如下所示:
var allItems = new List<DriveItem>();
await GetAllChildren(graphClient.Me.Drive, allItems);
foreach (var item in allItems)
{
Console.WriteLine(item.Name);
}
其中
static async Task GetAllChildren(IDriveRequestBuilder drive,List<DriveItem> result, IDriveItemRequestBuilder root = null)
{
root = root ?? drive.Root;
var items = await root.Children.Request().GetAsync();
result.AddRange(items.ToList());
foreach (var item in items)
{
if (item.Folder != null && item.Folder.ChildCount > 0)
{
await GetAllChildren(drive, result, drive.Items[item.Id]);
}
}
}
选项2
从性能的角度来看,有一种更好的方法可以通过以下端点来检索所有驱动器项目元数据:
GET https://graph.microsoft.com/v1.0/me/drive/list/items?$expand=driveItem
注意:仅需一个请求即可检索所有项目 这可能比以前的方法有很大优势
示例
var allItems = await graphClient.Me.Drive.List.Items.Request().Expand( i => i.DriveItem).GetAsync();
foreach (var item in allItems)
{
Console.WriteLine(item.DriveItem.Name); //print name
}