c # - Microsoft Graph API - Periksa apakah folder ada

10

Saya menggunakan Microsoft Graph API dan saya membuat folder seperti ini:

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

Pertanyaan saya adalah bagaimana cara memeriksa apakah folder ini ada dan apakah folder tersebut mendapatkan id dari folder tersebut?

pengguna979331
sumber

Jawaban:

4

Graph API menyediakan fasilitas pencarian , yang dapat Anda manfaatkan untuk mencari tahu apakah ada item. Anda memiliki opsi untuk menjalankan pencarian pertama dan kemudian membuat item jika tidak ada yang ditemukan, atau Anda dapat melakukan seperti yang disarankan @ Matt.G dan bermain-main nameAlreadyExistspengecualian:

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

Teks kueri yang digunakan untuk mencari item. Nilai dapat dicocokkan di beberapa bidang termasuk nama file, metadata, dan konten file.

Anda dapat bermain dengan permintaan pencarian dan melakukan hal-hal seperti filename=<yourName>atau berpotensi memeriksa jenis file (yang saya kira tidak akan membantu dalam kasus khusus Anda, tapi saya akan menyebutkannya demi kelengkapan)

timur
sumber
1

Keluarkan permintaan pencarian di wadah.

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

Anda kemudian harus mengulangi existingItemskoleksi ( mungkin termasuk beberapa halaman ) untuk menentukan apakah item itu ada.

Anda tidak menentukan kriteria untuk menentukan apakah suatu barang ada. Dengan asumsi Anda maksud dengan nama, Anda dapat:

var exists = existingItems.CurrentPage
               .Any(i => i.Name.Equals(Customer_Name.Text + Customer_LName.Text);
Paul Schaeflein
sumber
Ya, tetapi bagaimana saya mendapatkan ID dari ada?
user979331
Gunakan Where () atau FirstOrDefault () atau ekspresi yang sesuai.
Paul Schaeflein
1

Untuk mendapatkan folder dengan nama folder:

sebut grafik api Reference1 Reference2 :/me/drive/items/{item-id}:/path/to/file

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

  • Jika folder ada, ia mengembalikan respons driveItem , yang memiliki id

  • Jika folder tidak ada, ia mengembalikan 404 (NotFound)

Sekarang, saat membuat folder, jika folder sudah ada, untuk gagal panggilan, coba atur data tambahan sebagai berikut Referensi :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • Ini akan menghasilkan 409 Konflik, jika folder tersebut ada
Matt.G
sumber
Tetapi bagaimana saya mendapatkan id dari folder yang ada?
user979331
1

Sebuah pendekatan berbasis permintaan dapat dipertimbangkan dalam hal ini. Karena DriveItem.nameproperti desain menurut unik dalam folder, kueri berikut ini menunjukkan cara memfilter driveItemmenurut nama untuk menentukan apakah item drive ada:

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

yang dapat direpresentasikan dalam C # seperti ini:

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

Mengingat titik akhir yang disediakan, aliran dapat terdiri dari langkah-langkah berikut:

  • kirim permintaan untuk menentukan apakah folder dengan nama yang diberikan sudah ada
  • kirimkan yang kedua jika folder tidak ditemukan (atau kembalikan folder yang ada)

Contoh

Ini adalah contoh yang diperbarui

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

  }
Vadim Gremyachev
sumber
-1

Anda bisa mendapatkan ID folder dengan memanggil ini: https://graph.microsoft.com/v1.0/me/drive/root/children. Ini akan memberi Anda semua item di drive. Anda dapat menggunakan nama atau properti lain untuk memfilter hasil Anda untuk mendapatkan ID folder jika Anda belum memilikinya

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

Jika jenis item dalam drive adalah folder, ia akan mendapatkan folderproperti. Anda dapat memeriksa apakah properti ini ada dan apakah menjalankan kode Anda untuk menambahkan item.

Kevin Kulla
sumber