有没有办法以编程方式将文件列表从一个文件夹移动到一个驱动器中的另一个文件夹

时间:2019-05-02 08:51:16

标签: c# microsoft-graph onedrive microsoft-graph-sdks

我正在使用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 :(得分:0)

您可以使用JSON batching在一个HTTP调用中组合多达20个请求:

  

JSON批处理允许您通过将多个请求组合到单个JSON对象中来优化应用程序。

我知道他们正在努力获取add batching support to the 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}"
        }
      }
    }
  ]
}

答案 1 :(得分:0)

以下是您可以使用的图形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对象组成:请求。 requests属性是单个请求的数组。对于每个单独的请求,都需要id,method和url属性。

id属性主要用作将单个响应与请求相关联的相关值。这样,服务器就可以以最有效的顺序处理批处理中的请求。

方法和url属性与在给定HTTP请求开始时所看到的完全一样。该方法是HTTP方法,URL是通常将单个请求发送到的资源URL。

单个请求还可以选择包含headers属性和body属性。这两个属性通常都是JSON对象,如前面的示例所示。在某些情况下,主体可能是base64 URL编码的值,而不是JSON对象-例如,当主体是图像时。请求中包含正文时,标头对象必须包含Content-Type的值。

或者,我建议您在这种情况下使用云事件驱动的编程。您可以执行以下操作:

1)创建用于存储事件或命令的队列

2)从控制台应用程序推送命令。

3)从将异步的webjob或Azure函数进行处理。

希望有帮助。