如何在SharePoint Online中复制/移动文件?附控制台Demo实现
我发现很多朋友在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
相关产品推荐
相关产品推荐

