Graph API zapewnia funkcję wyszukiwania , którą można wykorzystać, aby dowiedzieć się, czy element istnieje. Możesz albo najpierw uruchomić wyszukiwanie, a następnie utworzyć element, jeśli nic nie zostanie znalezione, lub możesz zrobić tak, jak sugeruje @ Matt.G i obejść nameAlreadyExists
wyjątek:
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
}
}
Tekst zapytania używany do wyszukiwania elementów. Wartości można dopasować w kilku polach, w tym w nazwie pliku, metadanych i zawartości pliku.
możesz grać z wyszukiwanym hasłem i robić rzeczy takie jak filename=<yourName>
lub potencjalnie sprawdzać typy plików (co, jak sądzę, nie pomoże w twoim konkretnym przypadku, ale wspomnę o tym ze względu na kompletność)
Aby uzyskać folder o nazwie folderu:
wykres połączeń api Reference1 Reference2 :
/me/drive/items/{item-id}:/path/to/file
to znaczy
/drive/items/id-of-folder-I-am-putting-this-into:/{folderName}
Jeśli folder istnieje, zwraca odpowiedź driveItem , która ma identyfikator
Jeśli folder nie istnieje, zwraca 404 (NotFound)
Teraz, podczas tworzenia folderu, jeśli folder już istnieje, aby zakończyć połączenie, spróbuj ustawić dodatkowe dane w następujący sposób Odwołanie :
źródło
Pod tym względem można rozważyć podejście oparte na zapytaniach . Ponieważ
DriveItem.name
właściwość według projektu jest unikalna w obrębie folderu, poniższe zapytanie pokazuje, jak filtrowaćdriveItem
według nazwy w celu ustalenia, czy element dysku istnieje:który może być reprezentowany w języku C # w ten sposób:
Biorąc pod uwagę podany punkt końcowy przepływ może składać się z następujących kroków:
Przykład
Oto zaktualizowany przykład
źródło
Można uzyskać identyfikator folderu, wywołując w ten sposób:
https://graph.microsoft.com/v1.0/me/drive/root/children
. Otrzymasz wszystkie elementy na dysku. Możesz użyć nazwy lub innej właściwości do filtrowania wyników, aby uzyskać identyfikator folderu, jeśli jeszcze go nie maszJeśli typem elementu na dysku jest folder, otrzyma on
folder
właściwość. Możesz sprawdzić, czy ta właściwość istnieje i czy uruchamia kod, aby dodać element.źródło