c # - Microsoft Graph API - Verificar si existe la carpeta

10

Estoy usando Microsoft Graph API y estoy creando una carpeta como esta:

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

Mi pregunta es ¿cómo verifico si esta carpeta existe y si obtiene la identificación de la carpeta?

usuario979331
fuente

Respuestas:

4

Graph API proporciona una función de búsqueda que puede utilizar para averiguar si existe un elemento. Tiene la opción de ejecutar la búsqueda primero y luego crear un elemento si no se encuentra nada, o puede hacer lo que @ Matt.G sugiere y jugar con la nameAlreadyExistsexcepción:

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

El texto de consulta utilizado para buscar elementos. Los valores pueden coincidir en varios campos, incluidos el nombre de archivo, los metadatos y el contenido del archivo.

puedes jugar con la consulta de búsqueda y hacer cosas como filename=<yourName>examinar potencialmente tipos de archivos (lo que supongo que no va a ayudar en tu caso particular, pero lo mencionaría por completo)

timur
fuente
1

Emita una solicitud de búsqueda en el contenedor.

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

Luego debe iterar la existingItemscolección ( posible, incluidas varias páginas ) para determinar si el elemento existe.

No especifica los criterios para determinar si existe un artículo. Suponiendo que quiere decir por nombre, podría:

var exists = existingItems.CurrentPage
               .Any(i => i.Name.Equals(Customer_Name.Text + Customer_LName.Text);
Paul Schaeflein
fuente
Sí, pero ¿cómo obtengo la identificación?
user979331
Utilice Where () o FirstOrDefault () o una expresión apropiada.
Paul Schaeflein
1

Para obtener la carpeta con el nombre de la carpeta:

llamada gráfica api Referencia1 Referencia2 :/me/drive/items/{item-id}:/path/to/file

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

  • Si la carpeta existe, devuelve un respuesta driveItem , que tiene la identificación

  • Si la carpeta no existe, devuelve un 404 (NotFound)

Ahora, mientras crea una carpeta, si la carpeta ya existe, para fallar la llamada, intente configurar datos adicionales de la siguiente manera Referencia :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • Esto devolverá un conflicto 409, si la carpeta existe
Matt.G
fuente
Pero, ¿cómo obtendría la identificación de la carpeta existente?
user979331
1

Se podría considerar un enfoque basado en consultas a este respecto. Dado que la DriveItem.namepropiedad por diseño es única dentro de una carpeta, la siguiente consulta muestra cómo filtrar driveItempor nombre para determinar si existe un elemento de unidad:

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

que podría representarse en C # así:

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

Dado el punto final proporcionado, el flujo podría consistir en los siguientes pasos:

  • enviar una solicitud para determinar si ya existe una carpeta con un nombre de pila
  • envíe una segunda si no se encontró la carpeta (o devuelva una carpeta existente)

Ejemplo

Aquí hay un ejemplo actualizado

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

Puede obtener el ID de la carpeta llamando a esto: https://graph.microsoft.com/v1.0/me/drive/root/children. Le dará todos los elementos en el disco. Puede usar el nombre u otra propiedad para filtrar sus resultados para obtener la ID de la carpeta si aún no la tiene

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

Si el tipo de elemento en la unidad es una carpeta, obtendrá una folderpropiedad. Puede verificar si esta propiedad existe y si ejecuta su código para agregar el elemento.

Kevin Kulla
fuente