c # - Microsoft Graph API - Überprüfen Sie, ob ein Ordner vorhanden ist

10

Ich verwende die Microsoft Graph API und erstelle einen Ordner wie folgt:

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

Meine Frage ist, wie kann ich überprüfen, ob dieser Ordner vorhanden ist und ob er die ID des Ordners erhält?

user979331
quelle

Antworten:

4

Die Graph-API bietet eine Suchfunktion , mit der Sie herausfinden können, ob ein Element vorhanden ist. Sie haben entweder die Möglichkeit, zuerst die Suche auszuführen und dann ein Element zu erstellen, wenn nichts gefunden wurde, oder Sie können die von @ Matt.G vorgeschlagenennameAlreadyExists Ausnahmen ausführen und herumspielen :

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

Der Abfragetext, der zum Suchen nach Elementen verwendet wird. Die Werte können über mehrere Felder hinweg abgeglichen werden, einschließlich Dateiname, Metadaten und Dateiinhalt.

Sie können mit Suchanfragen spielen und Dinge wie filename=<yourName>Dateitypen tun oder möglicherweise untersuchen (was in Ihrem speziellen Fall vermutlich nicht hilfreich sein wird, aber ich würde es der Vollständigkeit halber erwähnen).

timur
quelle
1

Stellen Sie eine Suchanforderung für den Container.

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

Anschließend müssen Sie die existingItemsSammlung ( möglicherweise einschließlich mehrerer Seiten ) durchlaufen, um festzustellen, ob das Element vorhanden ist.

Sie geben keine Kriterien an, um festzustellen, ob ein Artikel vorhanden ist. Angenommen, Sie meinen mit Namen, könnten Sie:

var exists = existingItems.CurrentPage
               .Any(i => i.Name.Equals(Customer_Name.Text + Customer_LName.Text);
Paul Schaeflein
quelle
Ja, aber wie bekomme ich die ID von existiert?
user979331
Verwenden Sie Where () oder FirstOrDefault () oder einen geeigneten Ausdruck.
Paul Schaeflein
1

So erhalten Sie den Ordner mit dem Ordnernamen:

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

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

  • Wenn der Ordner vorhanden ist, wird eine driveItem- Antwort mit der ID zurückgegeben

  • Wenn der Ordner nicht vorhanden ist, wird ein 404 (NotFound) zurückgegeben.

Wenn der Ordner beim Erstellen eines Ordners bereits vorhanden ist, versuchen Sie, zusätzliche Daten wie folgt festzulegen , um den Aufruf fehlzuschlagen. Referenz :

    AdditionalData = new Dictionary<string, object>
    {
        { "@microsoft.graph.conflictBehavior", "fail" }
    }
  • Dies gibt einen 409-Konflikt zurück, wenn der Ordner vorhanden ist
Matt.G
quelle
Aber wie würde ich die ID des vorhandenen Ordners erhalten?
user979331
1

Diesbezüglich könnte ein abfragebasierter Ansatz in Betracht gezogen werden. Da die DriveItem.nameEigenschaft by design innerhalb eines Ordners eindeutig ist, zeigt die folgende Abfrage, wie nach driveItemNamen gefiltert wird, um festzustellen, ob ein Laufwerkselement vorhanden ist:

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

die in C # so dargestellt werden könnte:

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

Bei dem angegebenen Endpunkt kann der Fluss aus den folgenden Schritten bestehen:

  • Senden Sie eine Anfrage, um festzustellen, ob bereits ein Ordner mit einem bestimmten Namen vorhanden ist
  • Senden Sie einen zweiten Ordner, wenn der Ordner nicht gefunden wurde (oder geben Sie einen vorhandenen Ordner zurück).

Beispiel

Hier ist ein aktualisiertes Beispiel

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

Sie können die ID des Ordners erhalten, indem Sie Folgendes aufrufen : https://graph.microsoft.com/v1.0/me/drive/root/children. Sie erhalten alle Elemente im Laufwerk. Sie können den Namen oder eine andere Eigenschaft verwenden, um Ihre Ergebnisse zu filtern und die Ordner-ID abzurufen, falls Sie diese noch nicht haben

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

Wenn der Elementtyp im Laufwerk ein Ordner ist, erhält er eine folderEigenschaft. Sie können überprüfen, ob diese Eigenschaft vorhanden ist und ob Ihr Code zum Hinzufügen des Elements ausgeführt wird.

Kevin Kulla
quelle