c #-Microsoft Graph API-폴더가 있는지 확인


10

Microsoft Graph API를 사용하고 있으며 다음과 같이 폴더를 만들고 있습니다.

var driveItem = new DriveItem
{
    Name = Customer_Name.Text + Customer_LName.Text,
    Folder = new Folder
    {
    },
    AdditionalData = new Dictionary<string, object>()
    {
        {"@microsoft.graph.conflictBehavior","rename"}
    }
};

var newFolder = await App.GraphClient
  .Me
  .Drive
  .Items["id-of-folder-I-am-putting-this-into"]
  .Children
  .Request()
  .AddAsync(driveItem);

내 질문은이 폴더가 존재하고 폴더의 ID를 가져 오는지 어떻게 확인합니까?

답변:


4

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>하거나 잠재적으로 파일 유형 검사 (내가 특정 경우에 도움이 될하지 않는 것 같아요,하지만 난 완성도를 위해서 그것을 언급 것)


1

컨테이너 에서 검색 요청 을 발행하십시오 .

var existingItems = await graphServiceClient.Me.Drive
                          .Items["id-of-folder-I-am-putting-this-into"]
                          .Search("search")
                          .Request().GetAsync();

그런 다음 항목이 존재하는지 판별 하려면 existingItems콜렉션 을 반복해야합니다 ( 여러 페이지 포함 가능 ).

항목이 존재하는지 확인하기위한 기준을 지정하지 않습니다. 이름을 의미한다고 가정하면 다음을 수행 할 수 있습니다.

var exists = existingItems.CurrentPage
               .Any(i => i.Name.Equals(Customer_Name.Text + Customer_LName.Text);

예,하지만 ID를 어떻게 얻습니까?
user979331

Where () 또는 FirstOrDefault () 또는 적절한 식을 사용하십시오.
Paul Schaeflein '

1

폴더 이름으로 폴더를 가져 오려면 :

콜 그래프 API Reference1 Reference2 :/me/drive/items/{item-id}:/path/to/file

/drive/items/id-of-folder-I-am-putting-this-into:/{folderName}

  • 폴더가 존재 하면 ID가 있는 driveItem Response를 리턴합니다.

  • 폴더가 존재하지 않으면 404 (NotFound)를 반환합니다.

폴더를 만드는 동안 다음과 같이 이제 폴더가 이미 존재하는 경우, 전화를 실패하기 위해, 추가 데이터를 설정하려고 참조 :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • 폴더가 존재하면 409 충돌이 반환됩니다.

그러나 기존 폴더의 ID를 어떻게 얻습니까?
user979331

1

쿼리 기반의 접근 방식은 이 점에서 고려 될 수있다. 설계 기준으로 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();

제공된 엔드 포인트가 제공되면 플로우는 다음 단계로 구성 될 수 있습니다.

  • 주어진 이름을 가진 폴더가 이미 존재하는지 확인 요청을 제출
  • 폴더를 찾을 수없는 경우 두 번째 폴더를 제출하거나 기존 폴더를 반환하십시오.

다음은 업데이트 된 예입니다.

//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);

  }

-1

다음을 호출하여 폴더의 ID를 얻을 수 있습니다 https://graph.microsoft.com/v1.0/me/drive/root/children. 드라이브의 모든 항목을 제공합니다. 폴더 ID가없는 경우 이름 또는 다른 속성을 사용하여 결과를 필터링하여 폴더 ID를 얻을 수 있습니다.

public static bool isPropertyExist (dynamic d)
{
  try {
       string check = d.folder.childCount;
       return true;
  } catch {
       return false;
  }
}
var newFolder = await {https://graph.microsoft.com/v1.0/me/drive/items/{itemID}}


if (isPropertyExist(newFolder))
{
  //Your code goes here.
}

드라이브의 항목 유형이 폴더 인 경우 folder속성 을 가져옵니다 . 이 속성이 존재하는지 여부와 코드를 실행하여 항목을 추가하는지 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.