c # - Microsoft Graph API - Kiểm tra xem thư mục có tồn tại không


10

Tôi đang sử dụng Microsoft Graph API và tôi đang tạo một thư mục như vậy:

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

Câu hỏi của tôi là làm thế nào để kiểm tra xem thư mục này có tồn tại không và liệu nó có nhận được id của thư mục không?

Câu trả lời:


4

API đồ thị cung cấp một công cụ tìm kiếm mà bạn có thể sử dụng để tìm hiểu xem có tồn tại một mặt hàng không. Bạn có tùy chọn chạy tìm kiếm trước và sau đó tạo một mục nếu không tìm thấy gì hoặc bạn có thể làm như @ Matt.G gợi ý và chơi xung quanh nameAlreadyExistsngoại lệ:

        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
            }
        }

Các văn bản truy vấn được sử dụng để tìm kiếm các mục. Các giá trị có thể được khớp trên một số trường bao gồm tên tệp, siêu dữ liệu và nội dung tệp.

bạn có thể chơi với truy vấn tìm kiếm và thực hiện những việc như filename=<yourName>hoặc có khả năng kiểm tra các loại tệp (mà tôi đoán là sẽ không giúp ích gì trong trường hợp cụ thể của bạn, nhưng tôi muốn đề cập đến nó vì mục đích hoàn chỉnh)


1

Đưa ra yêu cầu tìm kiếm trên container.

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

Sau đó, bạn phải lặp lại existingItemsbộ sưu tập ( có thể bao gồm nhiều trang ) để xác định xem mục đó có tồn tại không.

Bạn không chỉ định tiêu chí để xác định nếu một mục tồn tại. Giả sử bạn có nghĩa là theo tên, bạn có thể:

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

Có, nhưng làm thế nào tôi có được ID từ tồn tại?
dùng979331

Sử dụng Where () hoặc FirstOrDefault () hoặc một biểu thức thích hợp.
Paul Schaeflein

1

Để lấy thư mục có tên thư mục:

gọi đồ thị api Reference1 Reference2 :/me/drive/items/{item-id}:/path/to/file

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

  • Nếu thư mục tồn tại, nó trả về phản hồi driveItem , có id

  • Nếu thư mục không tồn tại, nó sẽ trả về 404 (NotFound)

Bây giờ, trong khi tạo thư mục, nếu thư mục đã tồn tại, để thực hiện cuộc gọi, hãy thử thiết lập dữ liệu bổ sung như sau Tham khảo :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • Điều này sẽ trả về Xung đột 409, nếu thư mục tồn tại

Nhưng làm thế nào tôi có được id của thư mục hiện có?
dùng979331

1

Một cách tiếp cận dựa trên truy vấn có thể được xem xét trong vấn đề này. Kể từ khi thiết kế bởi DriveItem.nametài sản là duy nhất trong một thư mục, truy vấn sau đây cho thấy làm thế nào để lọc driveItemtheo tên để xác định xem ổ đĩa mục tồn tại:

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

có thể được biểu diễn trong C # như thế này:

var items = await graphClient
            .Me
            .Drive
            .Items[parentFolderId]
            .Children
            .Request()
            .Filter($"name eq '{folderName}'")
            .GetAsync();

Với điểm cuối được cung cấp, luồng có thể bao gồm các bước sau:

  • gửi yêu cầu để xác định xem một thư mục có tên đã tồn tại chưa
  • gửi thư thứ hai nếu không tìm thấy thư mục (hoặc trả lại thư mục hiện có)

Thí dụ

Dưới đây là một ví dụ cập nhật

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

Bạn có thể lấy ID của thư mục bằng cách gọi này : https://graph.microsoft.com/v1.0/me/drive/root/children. Nó sẽ cung cấp cho bạn tất cả các mục trong ổ đĩa. Bạn có thể sử dụng tên hoặc thuộc tính khác để lọc kết quả của mình để lấy ID thư mục nếu bạn chưa có nó

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.
}

Nếu loại mục trong ổ đĩa là một thư mục, nó sẽ nhận được một thuộc foldertính. Bạn có thể kiểm tra xem thuộc tính này có tồn tại không và liệu nó có chạy mã của bạn để thêm mục không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.