L'API Graph fournit une fonction de recherche que vous pouvez utiliser pour savoir si un élément existe. Vous avez soit la possibilité d'exécuter la recherche d'abord, puis de créer un élément si rien n'a été trouvé, ou vous pouvez faire ce que @ Matt.G suggère et jouer l' nameAlreadyExists
exception:
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
}
}
Texte de requête utilisé pour rechercher des éléments. Les valeurs peuvent être mises en correspondance dans plusieurs champs, notamment le nom de fichier, les métadonnées et le contenu du fichier.
vous pouvez jouer avec la requête de recherche et faire des choses comme filename=<yourName>
ou potentiellement examiner les types de fichiers (ce qui, je suppose, ne va pas aider dans votre cas particulier, mais je le mentionnerais pour des raisons d'exhaustivité)
Pour obtenir le dossier avec le nom du dossier:
api du graphique d'appel Reference1 Reference2 :
/me/drive/items/{item-id}:/path/to/file
c'est à dire
/drive/items/id-of-folder-I-am-putting-this-into:/{folderName}
Si le dossier existe, il renvoie un réponse driveItem , qui a l'id
Si le dossier n'existe pas, il renvoie un 404 (NotFound)
Maintenant, lors de la création d'un dossier, si le dossier existe déjà, afin d'échouer l'appel, essayez de définir des données supplémentaires comme suit Référence :
la source
Une approche basée sur les requêtes pourrait être envisagée à cet égard. Étant donné que la
DriveItem.name
propriété by design est unique dans un dossier, la requête suivante montre comment filtrerdriveItem
par nom afin de déterminer si l'élément de lecteur existe:qui pourrait être représenté en C # comme ceci:
Étant donné le point final fourni, le flux peut comprendre les étapes suivantes:
Exemple
Voici un exemple mis à jour
la source
Vous pouvez obtenir l'ID du dossier en appelant ceci:
https://graph.microsoft.com/v1.0/me/drive/root/children
. Cela vous donnera tous les éléments du lecteur. Vous pouvez utiliser le nom ou une autre propriété pour filtrer vos résultats afin d'obtenir l'ID du dossier si vous ne l'avez pas déjàSi le type d'élément dans le lecteur est un dossier, il obtiendra une
folder
propriété. Vous pouvez vérifier si cette propriété existe et si elle exécute votre code pour ajouter l'élément.la source