获取驱动器中的所有项目名称

时间:2019-05-20 11:50:16

标签: c# microsoft-graph

我需要一些简单的东西,但是已经花了很多时间并且还没有成功,所以我想获取给定驱动器中的所有文件名(其中一个用户,我以admin身份登录),我将自己扩展用于递归的解决方案,为使事情变得简单,我们假设在此结构中只有以下文件:

Microsoft Graph

/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

那不是我需要的输出

1 个答案:

答案 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
}