You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Microsoft.Graph与C#一键复制SharePoint文件夹及内容?

在Microsoft Graph与C#中复制SharePoint整个文件夹层级的方案

目前Microsoft Graph API没有提供一步复制整个文件夹层级(包含子文件夹和所有文件)的原生方法。官方提供的DriveItem.Copy接口仅能复制单个文件夹本身,不会递归处理其内部的子文件夹和文件,因此你需要通过递归遍历的方式实现完整的文件夹复制逻辑。

实现思路

  1. 先复制根文件夹到目标位置,获取新文件夹的ID。
  2. 递归遍历源文件夹的所有子项:
    • 若子项是文件夹,重复第一步的复制操作,再递归处理该子文件夹的内容。
    • 若子项是文件,直接调用复制接口将文件放到对应目标子文件夹中。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:03:23