Я вижу так много людей, которые пытаются копировать или перемещать файлы в SharePoint онлайн, поэтому я решил написать небольшое приложение для демонстрационной консоли, чтобы показать, как это сделать. Мы будем использовать метод CreateCopyJobs, доступный в CSOM, чтобы скопировать папку из одного семейства сайтов в другое. Этот метод может использоваться для копирования или перемещения файлов между семействами сайтов или даже на одном и том же S C, между различными библиотеками или папками внутри библиотеки. Метод работает точно так же, как и пользовательский интерфейс, когда вы пытаетесь скопировать или переместить что-то в библиотеку.
1 - Создать новое консольное приложение. NET. Мы будем использовать PnP, поэтому go к вашему менеджеру проекта NuGet и добавим SharePointPnPCoreOnline
2 - добавьте к вашему классу следующее:
using Microsoft.SharePoint.Client;
using Newtonsoft.Json;
using OfficeDevPnP.Core;
3 - определите следующее класс для получения статуса задания, которое мы будем проверять.
class CopyJobProgress
{
public string Event;
public string JobId;
public string CorrelationId;
}
4 - Теперь добавьте этот основной метод main:
static void Main(string[] args)
{
var siteUrl = "https://...-admin.sharepoint.com";
var userName = "admin@...";
var 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://....sharepoint.com/sites/<site>/<library>/<file or folder>";
string destinationPath = "https://....sharepoint.com/sites/<site>/<destination library>";
var createJobInfo = ctx.Site.CreateCopyJobs(new string[] { sourceFile }, destinationPath,
new CopyMigrationOptions() { IsMoveMode = false, 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!");
}
}