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

如何在SharePoint Online中复制/移动文件?附控制台Demo实现

SharePoint Online 文件/文件夹复制/移动(跨站集支持)实现方案

我发现很多朋友在SharePoint Online中复制或移动文件/文件夹时遇到不少困难,因此特意编写了一个演示控制台应用来展示具体实现方法。这里我们会用到CSOM中的CreateCopyJobs方法,它不仅支持跨网站集复制文件夹,也能处理同网站集内不同文档库或文件夹之间的复制/移动操作,实现效果和UI手动操作完全一致。

实现步骤

1. 准备项目依赖

创建一个新的.NET控制台应用,通过NuGet包管理器添加SharePointPnPCoreOnline包。

2. 引入必要的命名空间

在类文件的头部添加以下引用:

using Microsoft.SharePoint.Client;
using Newtonsoft.Json;
using OfficeDevPnP.Core;

3. 定义作业状态接收类

我们需要一个类来解析复制作业的状态日志,定义CopyJobProgress类:

class CopyJobProgress
{
    public string Event;
    public string JobId;
    public string CorrelationId;
}

4. 核心实现代码(Main方法示例)

下面是完整的Main方法示例,包含认证、创建复制作业、跟踪作业进度的逻辑:

static void Main(string[] args)
{
    var siteUrl = "https://your-domain-admin.sharepoint.com";
    var userName = "admin@your-domain.onmicrosoft.com";
    var password = "your-password";

    AuthenticationManager authManager = new AuthenticationManager();
    using (var ctx = authManager.GetSharePointOnlineAuthenticatedContextTenant(siteUrl, userName, password))
    {
        var web = ctx.Web;
        ctx.Load(web);
        ctx.ExecuteQuery();

        // 替换为实际的源文件/文件夹路径
        string sourceFile = "https://your-domain.sharepoint.com/sites/source-site/source-library/source-folder-or-file";
        // 替换为实际的目标文档库路径
        string destinationPath = "https://your-domain.sharepoint.com/sites/target-site/target-library";

        var createJobInfo = ctx.Site.CreateCopyJobs(
            new string[] { sourceFile }, 
            destinationPath, 
            new CopyMigrationOptions() 
            {
                IsMoveMode = false, // false为复制,true为移动
                IgnoreVersionHistory = true,
                AllowSchemaMismatch = true,
                NameConflictBehavior = MigrationNameConflictBehavior.Replace
            });
        ctx.ExecuteQueryRetry();

        Dictionary<string, CopyJobProgress> eventsFound = new Dictionary<string, CopyJobProgress>();
        bool jobEndFound = false;

        // 轮询跟踪作业进度
        while (!jobEndFound)
        {
            var progress = ctx.Site.GetCopyJobProgress(createJobInfo[0]);
            ctx.ExecuteQuery();

            foreach (string log in progress.Value.Logs)
            {
                CopyJobProgress progressRes = (CopyJobProgress)JsonConvert.DeserializeObject(log, typeof(CopyJobProgress));
                if (!eventsFound.ContainsKey(progressRes.Event))
                {
                    Console.WriteLine(DateTime.Now + " - " + progressRes.Event + " - CorrelationId: " + progressRes.CorrelationId);
                    eventsFound[progressRes.Event] = progressRes;
                }
                if (progressRes.Event == "JobEnd")
                {
                    jobEndFound = true;
                }
            }

            if (!jobEndFound)
                System.Threading.Thread.Sleep(2000);
        }

        Console.WriteLine("Done!");
    }
}

关键参数说明

  • IsMoveMode:设置为true时执行移动操作,false时执行复制操作
  • IgnoreVersionHistory:是否忽略文件的版本历史
  • AllowSchemaMismatch:允许源和目标文档库的字段架构不匹配
  • NameConflictBehavior:处理文件名冲突的策略,这里用的是替换已有文件,你也可以根据需求选择其他枚举值

内容的提问来源于stack exchange,提问作者Pedro Soares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:18:15