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 อ้างอิง 1 ข้อมูลอ้างอิง 2 :/me/drive/items/{item-id}:/path/to/file

กล่าวคือ /drive/items/id-of-folder-I-am-putting-this-into:/{folderName}

  • หากโฟลเดอร์มีอยู่แล้วจะส่งคืนการตอบกลับdriveItemซึ่งมี ID

  • ถ้าโฟลเดอร์ไม่มีอยู่มันจะคืนค่า 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คุณจะได้รับรหัสของโฟลเดอร์โดยการเรียกนี้: มันจะให้รายการทั้งหมดในไดรฟ์ คุณสามารถใช้ชื่อหรือคุณสมบัติอื่นเพื่อกรองผลลัพธ์เพื่อรับ 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.