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

Is there any way to move list of file from one folder to another in one drive programatically

我正在使用 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;
}

我想向它传递一个文件列表和目的地,这应该在单个请求中将所有文件移动到目的地

您可以使用 JSON batching:

在一次 HTTP 调用中合并最多 20 个请求

JSON batching allows you to optimize your application by combining multiple requests into a single JSON object.

我知道他们正在努力获得 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}"
        }
      }
    }
  ]
}

这是图表 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 和 post json 请求。

请求格式

始终使用 POST 将批处理请求发送到 /$batch 端点。

一个 JSON 批处理请求 body 由一个 JSON object 和一个必需的 属性: 请求组成。 requests 属性 是单个请求的数组。对于每个单独的请求,id、方法和 url 属性都是必需的。

id 属性 主要用作关联值,将各个响应与请求相关联。这允许服务器以最有效的顺序批量处理请求。

方法和 url 属性正是您在任何给定 HTTP 请求开始时看到的内容。方法是 HTTP 方法,URL 是资源 URL 通常将单个请求发送到的资源。

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

的值

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

1) 创建一个queue用于存储事件或命令

2) 从您的控制台应用推送命令。

3) 从异步的 webjob 或 Azure 函数处理它。

希望对您有所帮助。