クエリベースのアプローチは、この点で考えることができます。設計上、DriveItem.name
プロパティはフォルダ内で一意であるため、次のクエリはdriveItem
、ドライブアイテムが存在するかどうかを判断するために名前でフィルタリングする方法を示しています。
https://graph.microsoft.com/v1.0/me/drive/items/{parent-item-id}/children?$filter=name eq '{folder-name}'
これは次のようにC#で表すことができます。
var items = await graphClient
.Me
.Drive
.Items[parentFolderId]
.Children
.Request()
.Filter($"name eq '{folderName}'")
.GetAsync();
提供されたエンドポイントが与えられた場合、フローは次のステップで構成されます。
- 指定された名前のフォルダがすでに存在するかどうかを確認するリクエストを送信する
- フォルダーが見つからなかった場合は2つ目を送信します(または既存のフォルダーを返します)
例
これが更新された例です
//1.ensure drive item already exists (filtering by name)
var items = await graphClient
.Me
.Drive
.Items[parentFolderId]
.Children
.Request()
.Filter($"name eq '{folderName}'")
.GetAsync();
if (items.Count > 0) //found existing item (folder facet)
{
Console.WriteLine(items[0].Id); //<- gives an existing DriveItem Id (folder facet)
}
else
{
//2. create a folder facet
var driveItem = new DriveItem
{
Name = folderName,
Folder = new Folder
{
},
AdditionalData = new Dictionary<string, object>()
{
{"@microsoft.graph.conflictBehavior","rename"}
}
};
var newFolder = await graphClient
.Me
.Drive
.Items[parentFolderId]
.Children
.Request()
.AddAsync(driveItem);
}