Я использую Microsoft Graph для управления файлами в OneDrive. Мне нужно найти файл в определенной папке, и если файл существует, удалить этот файл.
Я использую следующий код для поиска файла, он дает результаты поиска для всего диска.
var checkIfExists = this.graphClient
.Me
.Drive
.Search(item["FileName"].ToString())
.Request()
.GetAsync()
.Result;
Мне нужно искать файл только в определенной папке, например, только в дублирующейся папке.
Мне действительно нужно искать в папке имя файла.
Поскольку диск — это ресурс верхнего уровня, представляющий один диск пользователя, он связан с другими элементами, известными как элементы диска. Элементом диска может быть что угодно: файл, папка или любой другой элемент, хранящийся на диске.
Таким образом, для поиска определенного файла на диске вы можете сделать запрос;
var driveItems = await graphClient.Me.Drive.Root
.Search(<'{search-query}'>)
.Request()
.GetAsync();
Это должно помочь вам получить DriveItem на основе вашего поискового запроса. После того, как вы получили DriveItem, вы можете сделать запрос на его удаление на основе идентификатора элемента;
await graphClient.Me.Drive
.Items[<"{item-id}">]
.Request()
.DeleteAsync();
Обновлять:
По просьбе о помощи с кодом для поиска файла и его удаления, я дал его ниже для вашей справки.
var files = await graphClient.Me.Drive.Root
.Search("abc.pdf")
.Request()
.GetAsync();
var duplicateFile = files
.Where(driveItem => driveItem.ParentReference.Name
.ToLower() == "duplicate")
.FirstOrDefault();
if (duplicateFile != null) {
await graphClient.Me.Drive
.Items[duplicateFile.Id]
.Request()
.DeleteAsync();
}
Предложенный вами поисковый запрос дает страницы коллекции поиска, и если файл существует более чем в одной папке, он возвращает все результаты, становится трудно найти файл, который нужно удалить.
Надеюсь, вы используете правильный поисковый запрос? Тот, который я поместил в свой фрагмент кода, является заполнителем.
Я новичок в графическом API, не могли бы вы предложить поисковый запрос. Пусть файл с именем 'abc.pdf' будет искать в копии папки. Файл «abc.pdf» также находится в другом вложении папки. Я не хочу включать результаты поиска из папки вложений.
Я обновил ответ фрагментом кода. Надеюсь, это поможет.
Где исключение, вызывающее исключение: ссылка на объект не указывает на экземпляр объекта. driveItem.ParentReference.Name возвращает значение null каждый раз, независимо от того, найдено совпадение или нет.
@ShyamNarayan Знаете ли вы точный путь к файлу, где вы ожидаете, что он будет в случае дублирования?
Вы можете ограничить поиск любым путем, который вам нравится. Например, используя набор данных Обозреватель графов по умолчанию, мы можем искать finance
по всему Диску, используя этот запрос:
https://graph.microsoft.com/v1.0/me/drive/root/search(q='finance')?select=name,id,webUrl
Если мы предпочитаем искать только в одной подпапке (например, /CR-227 Project/
), то мы можем использовать этот путь в качестве отправной точки:
https://graph.microsoft.com/v1.0/me/drive/root:/CR-227 Project:/search(q='finance')?select=name,id,webUrl
Кроме того, если мы знаем DriveItem.Id
для /CR-227 Project/
(01BYE5RZ6TAJHXA5GMWZB2HDLD7SNEXFFU
), то мы могли бы использовать этот идентификатор вместо пути:
https://graph.microsoft.com/v1.0/me/drive/items/01BYE5RZ6TAJHXA5GMWZB2HDLD7SNEXFFU/search(q='finance')?select=name,id,webUrl
Вам действительно нужно искать определенную папку (и все ее подпапки) или вам просто нужно знать, является ли файл с определенным именем дочерним элементом определенной папки? Поиск может быть излишним