c # - মাইক্রোসফ্ট গ্রাফ এপিআই - ফোল্ডারটি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


10

আমি মাইক্রোসফ্ট গ্রাফ এপিআই ব্যবহার করছি এবং আমি এর মতো একটি ফোল্ডার তৈরি করছি:

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

আমার প্রশ্ন হ'ল আমি কীভাবে চেক করব যে এই ফোল্ডারটি বিদ্যমান আছে এবং যদি এটি ফোল্ডারের আইডি পায়?

উত্তর:


4

গ্রাফ এপিআই একটি অনুসন্ধানের সুবিধা সরবরাহ করে , যা আপনি কোনও আইটেমের উপস্থিতি খুঁজে বের করতে ব্যবহার করতে পারেন। আপনার কাছে প্রথমে অনুসন্ধান চালানোর এবং পরে যদি কিছু না পাওয়া যায় তবে কোনও আইটেম তৈরির বিকল্প রয়েছে, বা আপনি @ ম্যাট.জি এর পরামর্শ অনুসারে করতে পারেন এবং 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);

হ্যাঁ, তবে আমি কীভাবে উপস্থিত থেকে আইডি পাব?
ব্যবহারকারী 979331

যেখানে () বা ফার্স্টআরডিফল্ট () বা একটি উপযুক্ত এক্সপ্রেশন ব্যবহার করুন।
পল শ্যাফেলিন

1

ফোল্ডারের নাম সহ ফোল্ডারটি পেতে:

কল গ্রাফ এপিআই রেফারেন্স 1 রেফারেন্স 2 :/me/drive/items/{item-id}:/path/to/file

অর্থাত /drive/items/id-of-folder-I-am-putting-this-into:/{folderName}

  • যদি ফোল্ডারটি বিদ্যমান থাকে তবে এটি ড্রাইভ আইটেম প্রতিক্রিয়া ফিরিয়ে দেয়, এতে আইডি রয়েছে

  • যদি ফোল্ডারটি বিদ্যমান না থাকে তবে এটি 404 (নটফাউন্ড) প্রদান করে

এখন, একটি ফোল্ডার তৈরি করার সময়, যদি ফোল্ডারের আগে থেকেই আছে, যাতে কল ব্যর্থ করার জন্য, অতিরিক্ত ডেটা সেটিং হিসেবে অনুসরণ করে চেষ্টা রেফারেন্স :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • ফোল্ডারটি উপস্থিত থাকলে এটি একটি 409 সংঘাত ফিরিয়ে দেবে

তবে আমি কীভাবে বিদ্যমান ফোল্ডারটির আইডি পাব?
ব্যবহারকারী 979331

1

এই ক্ষেত্রে একটি প্রশ্ন ভিত্তিক পদ্ধতির বিবেচনা করা যেতে পারে। যেহেতু ডিজাইন দ্বারা DriveItem.nameসম্পত্তি কোনও ফোল্ডারের মধ্যে স্বতন্ত্র, তাই driveItemড্রাইভের আইটেমটি বিদ্যমান কিনা তা নির্ধারণ করার জন্য নিম্নলিখিত কোয়েরি নাম অনুসারে কীভাবে ফিল্টার করবেন তা দেখায় :

https://graph.microsoft.com/v1.0/me/drive/items/{parent-item-id}/children?$filter=name eq '{folder-name}'

যা সি # তে এভাবে প্রতিনিধিত্ব করতে পারে:

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

আপনি এই কল করে ফোল্ডার আইডি পেতে পারেন: https://graph.microsoft.com/v1.0/me/drive/root/children। এটি আপনাকে ড্রাইভের সমস্ত আইটেম দেবে। ফোল্ডার আইডি না থাকলে আপনি নিজের ফলাফল ফিল্টার করতে নাম বা অন্য কোনও সম্পত্তি ব্যবহার করতে পারেন যদি তা ইতিমধ্যে না থাকে

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.