如何用Microsoft.Graph与C#一键复制SharePoint文件夹及内容?
目前Microsoft Graph API没有提供一步复制整个文件夹层级(包含子文件夹和所有文件)的原生方法。官方提供的DriveItem.Copy接口仅能复制单个文件夹本身,不会递归处理其内部的子文件夹和文件,因此你需要通过递归遍历的方式实现完整的文件夹复制逻辑。
实现思路
- 先复制根文件夹到目标位置,获取新文件夹的ID。
- 递归遍历源文件夹的所有子项:
- 若子项是文件夹,重复第一步的复制操作,再递归处理该子文件夹的内容。
- 若子项是文件,直接调用复制接口将文件放到对应目标子文件夹中。
C#代码示例
使用Microsoft Graph SDK实现递归复制:
using Microsoft.Graph; using System.Threading.Tasks; public async Task CopySharePointFolderHierarchy(GraphServiceClient graphClient, string siteId, string driveId, string sourceFolderId, string targetParentFolderId, string newFolderName) { // 复制源文件夹到目标父目录 var copyStatus = await graphClient.Sites[siteId].Drives[driveId].Items[sourceFolderId] .Copy(newFolderName, new ItemReference { Id = targetParentFolderId }) .Request() .PostAsync(); // 等待文件夹复制完成(确保目标文件夹已创建) while (copyStatus.Status != "completed") { await Task.Delay(1000); copyStatus = await graphClient.Sites[siteId].Drives[driveId].Items[copyStatus.Id] .Request() .GetAsync(); } var targetFolderId = copyStatus.Id; // 获取源文件夹下的所有子项 var sourceItems = await graphClient.Sites[siteId].Drives[driveId].Items[sourceFolderId].Children .Request() .GetAsync(); foreach (var item in sourceItems) { if (item.Folder != null) { // 递归复制子文件夹 await CopySharePointFolderHierarchy(graphClient, siteId, driveId, item.Id, targetFolderId, item.Name); } else if (item.File != null) { // 复制单个文件到目标文件夹 await graphClient.Sites[siteId].Drives[driveId].Items[item.Id] .Copy(item.Name, new ItemReference { Id = targetFolderId }) .Request() .PostAsync(); } } }
注意事项
- 权限配置:确保你的应用已获得足够的权限,如
Files.ReadWrite.All或Sites.ReadWrite.All(根据实际场景选择最小权限)。 - 限流处理:如果复制大量文件或大文件,需添加重试逻辑处理Microsoft Graph的限流机制,避免请求被拒绝。
- 异步状态:文件夹复制是异步操作,必须等待状态变为
completed后再处理子项,否则可能因目标文件夹未创建完成导致失败。
内容的提问来源于stack exchange,提问作者Thomas Hellström
相关产品推荐
相关产品推荐

