c # - Microsoft ग्राफ़ एपीआई - जाँच करें कि क्या फ़ोल्डर मौजूद है


10

मैं Microsoft ग्राफ़ 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);

मेरा सवाल यह है कि मैं कैसे जांचूं कि क्या यह फ़ोल्डर मौजूद है और यदि यह फ़ोल्डर की आईडी प्राप्त करता है?

जवाबों:


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

हां, लेकिन मुझे आईडी कैसे मिलेगी?
user979331

जहां () या FirstOrDefault () या एक उपयुक्त अभिव्यक्ति का उपयोग करें।
पॉल शैफेलिन

1

फ़ोल्डर नाम के साथ फ़ोल्डर प्राप्त करने के लिए:

कॉल ग्राफ एपीआई संदर्भ 1 संदर्भ 2 :/me/drive/items/{item-id}:/path/to/file

अर्थात /drive/items/id-of-folder-I-am-putting-this-into:/{folderName}

  • यदि फ़ोल्डर मौजूद है, तो यह एक ड्राइव लौटाता है रिस्पॉन्स , जिसमें आईडी है

  • यदि फ़ोल्डर मौजूद नहीं है, तो यह 404 (NotFound) देता है

अब फ़ोल्डर बनाते समय, यदि फ़ोल्डर पहले से मौजूद है, तो कॉल को विफल करने के लिए, संदर्भ के रूप में अतिरिक्त डेटा सेट करने का प्रयास करें :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • यदि फ़ोल्डर मौजूद है, तो यह 409 संघर्ष लौटाएगा

लेकिन मुझे मौजूदा फ़ोल्डर की आईडी कैसे मिलेगी?
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

आप इसे कॉल करके फ़ोल्डर की आईडी प्राप्त कर सकते हैं 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संपत्ति मिलेगी । आप देख सकते हैं कि क्या यह संपत्ति मौजूद है और यदि यह आइटम जोड़ने के लिए अपना कोड चलाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.