c # - API Microsoft Graph: controlla se esiste una cartella


10

Sto usando l'API di Microsoft Graph e sto creando una cartella in questo modo:

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

La mia domanda è come posso verificare se questa cartella esiste e se ottiene l'ID della cartella?

Risposte:


4

L'API Graph offre una funzione di ricerca che puoi utilizzare per scoprire se esiste un elemento. O hai la possibilità di eseguire prima la ricerca e quindi di creare un elemento se non è stato trovato nulla, oppure potresti fare come suggerisce @ Matt.G e risolvere l'nameAlreadyExists eccezione:

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

Il testo della query utilizzato per cercare elementi. I valori possono essere abbinati su più campi tra cui nome file, metadati e contenuto del file.

puoi giocare con la query di ricerca e fare cose come filename=<yourName>o potenzialmente esaminare i tipi di file (che immagino non ti aiuteranno nel tuo caso particolare, ma lo menzionerei per completezza)


1

Emettere una richiesta di ricerca sul contenitore.

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

È quindi necessario ripetere l'iter della existingItemsraccolta ( possibile includendo più pagine ) per determinare se l'elemento esiste.

Non si specificano i criteri per determinare se esiste un articolo. Supponendo che intendi per nome, potresti:

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

Sì, ma come ottengo l'ID esiste?
user979331

Utilizzare Where () o FirstOrDefault () o un'espressione appropriata.
Paul Schaeflein,

1

Per ottenere la cartella con il nome della cartella:

call graph api Riferimento1 Riferimento2 :/me/drive/items/{item-id}:/path/to/file

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

  • Se la cartella esiste restituisce una risposta driveItem , che ha l'id

  • Se la cartella non esiste, restituisce un 404 (NotFound)

Ora, durante la creazione di una cartella, se la cartella esiste già, per fallire la chiamata, prova a impostare dati aggiuntivi come segue Riferimento :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • Ciò restituirà un conflitto 409, se la cartella esiste

Ma come posso ottenere l'ID della cartella esistente?
user979331

1

Un approccio basato su query potrebbe essere considerato al riguardo. Poiché la DriveItem.nameproprietà di design è univoca in una cartella, la query seguente dimostra come filtrare driveItemper nome per determinare se esiste un elemento di unità:

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

che potrebbe essere rappresentato in C # in questo modo:

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

Dato l'endpoint fornito, il flusso potrebbe consistere nelle seguenti fasi:

  • inviare una richiesta per determinare se esiste già una cartella con un determinato nome
  • inviare un secondo se la cartella non è stata trovata (o restituire una cartella esistente)

Esempio

Ecco un esempio aggiornato

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

È possibile ottenere l'ID della cartella chiamando questo: https://graph.microsoft.com/v1.0/me/drive/root/children. Ti darà tutti gli elementi nel disco. È possibile utilizzare il nome o un'altra proprietà per filtrare i risultati per ottenere l'ID cartella se non lo si possiede già

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

Se il tipo di elemento nell'unità è una cartella, otterrà una folderproprietà. Puoi verificare se questa proprietà esiste e se esegue il tuo codice per aggiungere l'elemento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.