Есть ли способ программно перемещать список файлов из одной папки в другую на одном диске - PullRequest
0 голосов
/ 02 мая 2019

Я использую Microsoft graph API для чтения файла из одной папки на диске (т. Е. Необработанной), после обработки переместите ее в другую папку (т. Е. Обработанная). В этом процессе мне нужно переместить все обработанные файлы в одном запросе.

В настоящее время я перемещаю один файл в одном запросе, и он работает нормально.

Вот пример кода, который я использую:

public async Task<List<DriveItem>> MoveItemToFolder(string itempath, string destinationpath)
{
    List<DriveItem> items = new List<DriveItem>();
    string sourceId, destinationId;
    if (!string.IsNullOrEmpty(itempath) && !string.IsNullOrEmpty(destinationpath))
    {
        var sResult = this.graphClient
            .Drive
            .Root
            .ItemWithPath("/" + itempath)
            .Request()
            .GetAsync()
            .Result;

        sourceId = sResult.Id;

        var dResult = this.graphClient
            .Drive
            .Root
            .ItemWithPath("/" + destinationpath)
            .Request()
            .GetAsync()
            .Result;

        destinationId = dResult.Id;
        DriveItem fileOrFolder = await graphClient
            .Me
            .Drive
            .Items[sourceId]
            .Request()
            .UpdateAsync(new DriveItem
            {
                // The following example moves an item by
                // updating the item's ParentReference.Id property.
                ParentReference = new ItemReference
                {
                    Id = destinationId
                }
            });

        if (fileOrFolder != null)
        {
            // Get file or folder properties.
            items.Add(new DriveItem
            {
                Name = fileOrFolder.Name,
                    Id = fileOrFolder.Id,
            });
        }
        return items;
    }
    else
        return null;
}

Я хочу передать ему список файлов и места назначения, и это должно переместить все файлы в место назначения в одном запросе

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Вот график формы API JSON, который вы можете использовать:

POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json

Пример json для другого запроса будет выглядеть следующим образом:

{
  "requests": [
    {
      "id": "1",
      "method": "GET",
      "url": "/me/drive/root:/{file}:/content"
    },
    {
      "id": "2",
      "method": "GET",
      "url": "/me/planner/tasks"
    },
    {
      "id": "3",
      "method": "GET",
      "url": "/groups/{id}/events"
    },
    {
      "id": "4",
      "url": "/me",
      "method": "PATCH",
      "body": {
        "city" : "Redmond"
      },
      "headers": {
        "Content-Type": "application/json"
      }
    }
  ]
}

Ответы на пакетные запросы могут отображаться в другом порядке. Свойство id можно использовать для сопоставления отдельных запросов и ответов. Вот пример ответа на вышеуказанный запрос:

{
  "responses": [
    {
      "id": "1",
      "status": 302,
      "headers": {
        "location": "https://b0mpua-by3301.files.1drv.com/y23vmagahszhxzlcvhasdhasghasodfi"
      }
    },
    {
      "id": "3",
      "status": 401,
      "body": {
        "error": {
          "code": "Forbidden",
          "message": "..."
        }
      }
    },
    {
      "id": "2",
      "status": 200,
      "body": {
        "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.plannerTask)",
        "value": []
      }
    },
    {
      "id": "4",
      "status": 204,
      "body": null
    }
  ]
}

В c # вы можете просто использовать httpclient и опубликовать запрос json.

Формат запроса

Пакетные запросы всегда отправляются с помощью POST на конечную точку / $ batch.

Тело пакетного запроса JSON состоит из одного объекта JSON с одним обязательным свойством: запросы. Свойство запросы представляет собой массив отдельных запросов. Для каждого отдельного запроса требуются свойства id, method и url.

Свойство id действует в основном как значение корреляции, чтобы связать отдельные ответы с запросами. Это позволяет серверу обрабатывать запросы в пакете в наиболее эффективном порядке.

Метод и свойства url - это именно то, что вы увидите в начале любого данного HTTP-запроса. Метод - это метод HTTP, а URL - это URL ресурса, на который обычно отправляется отдельный запрос.

Индивидуальные запросы также могут содержать свойство headers и body body. Оба эти свойства обычно являются объектами JSON, как показано в предыдущем примере. В некоторых случаях тело может представлять собой значение в кодировке URL base64, а не объект JSON, например, когда тело является изображением. Когда тело включается в запрос, объект заголовков должен содержать значение для Content-Type.

В качестве альтернативы я бы предложил вам использовать программирование, управляемое облачными событиями, в подобных сценариях. Вы можете сделать следующее:

1) Создать очередь для хранения событий или команд

2) Нажмите команду из консольного приложения.

3) Обработайте его из функции веб-задания или Azure, которая будет асинхронной.

Надеюсь, это поможет.

0 голосов
/ 03 мая 2019

Вы можете объединить до 20 запросов в одном HTTP-вызове, используя JSON-пакетирование :

JSON-пакетирование позволяет оптимизировать ваше приложение путем объединения нескольких запросов в один объект JSON,

Я знаю, что они работают над тем, чтобы добавить пакетную поддержку в SDK , но так как я не уверен, что она еще доступна, я не хочу давать кодобразец (я бы, вероятно, что-то пропустил).Как правило, вызов конечной точки пакета довольно прост:

POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json

{
  "requests": [
    {
      "id": "1",
      "method": "PATCH",
      "url": "/me/drive/items/{sourceId-1}",
      "body": {
        "parentReference": {
          "id": "{destinationId}"
        }
      }
    },
    {
      "id": "2",
      "method": "PATCH",
      "url": "/me/drive/items/{sourceId-2}",
      "body": {
        "parentReference": {
          "id": "{destinationId}"
        }
      }
    },
    {
      "id": "3",
      "method": "PATCH",
      "url": "/me/drive/items/{sourceId-3}",
      "body": {
        "parentReference": {
          "id": "{destinationId}"
        }
      }
    }
  ]
}
...