Graph API предоставляет средство поиска , которое вы можете использовать, чтобы узнать, существует ли элемент. У вас есть возможность сначала запустить поиск, а затем создать элемент, если ничего не найдено, или вы можете сделать, как подсказывает @ Matt.G, и обойти nameAlreadyExists
исключение:
var driveItem = new DriveItem
{
Name = Customer_Name.Text + Customer_LName.Text,
Folder = new Folder
{
},
AdditionalData = new Dictionary<string, object>()
{
{"@microsoft.graph.conflictBehavior","fail"}
}
};
try
{
driveItem = await graphserviceClient
.Me
.Drive.Root.Children
.Items["id-of-folder-I-am-putting-this-into"]
.Children
.Request()
.AddAsync(driveItem);
}
catch (ServiceException exception)
{
if (exception.StatusCode == HttpStatusCode.Conflict && exception.Error.Code == "nameAlreadyExists")
{
var newFolder = await graphserviceClient
.Me
.Drive.Root.Children
.Items["id-of-folder-I-am-putting-this-into"]
.Search(driveItem.Name) // the API lets us run searches https://docs.microsoft.com/en-us/graph/api/driveitem-search?view=graph-rest-1.0&tabs=csharp
.Request()
.GetAsync();
// since the search is likely to return more results we should filter it further
driveItem = newFolder.FirstOrDefault(f => f.Folder != null && f.Name == driveItem.Name); // Just to ensure we're finding a folder, not a file with this name
Console.WriteLine(driveItem?.Id); // your ID here
}
else
{
Console.WriteLine("Other ServiceException");
throw;// handle this
}
}
Текст запроса, используемый для поиска предметов. Значения могут совпадать в нескольких полях, включая имя файла, метаданные и содержимое файла.
Вы можете играть с поисковым запросом и делать что-то вроде filename=<yourName>
или, возможно, исследовать типы файлов (что, я думаю, не поможет в вашем конкретном случае, но я бы упомянул это для полноты картины)
Чтобы получить папку с именем папки:
граф вызовов API Reference1 Reference2 :
/me/drive/items/{item-id}:/path/to/file
т.е.
/drive/items/id-of-folder-I-am-putting-this-into:/{folderName}
Если папка существует, она возвращает ответ driveItem , который имеет идентификатор
Если папка не существует, она возвращает 404 (NotFound)
Теперь, при создании папки, если папка уже существует, для того , чтобы потерпеть неудачу вызов, попробуйте установить дополнительные данные следующим образом Ссылка :
источник
В этом отношении можно рассмотреть подход, основанный на запросах . Поскольку
DriveItem.name
свойство by design уникально в папке, следующий запрос демонстрирует, как фильтроватьdriveItem
по имени, чтобы определить, существует ли элемент диска:который может быть представлен в C # следующим образом:
Учитывая предоставленную конечную точку, поток может состоять из следующих шагов:
пример
Вот обновленный пример
источник
Вы можете получить идентификатор папки, вызвав этим:
https://graph.microsoft.com/v1.0/me/drive/root/children
. Это даст вам все предметы на диске. Вы можете использовать имя или другое свойство для фильтрации ваших результатов, чтобы получить идентификатор папки, если у вас его еще нетЕсли тип элемента на диске является папкой, он получит
folder
свойство. Вы можете проверить, существует ли это свойство и запускает ли он ваш код для добавления элемента.источник