Получить все названия предметов в диске - PullRequest
0 голосов
/ 20 мая 2019

Мне нужно что-то простое, но я потратил на это много часов и пока не получилось, я хочу получить все имена файлов на данном диске (один из пользователей, я вошел как администратор),Я расширю решение для рекурсивного, чтобы сделать вещи проще. Предположим, у меня есть только следующие файлы в этой структуре:

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 голосов
/ 21 мая 2019

Это ожидаемое поведение, поскольку конечная точка 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...