Копирование или перемещение файлов в SharePoint Online - PullRequest
1 голос
/ 09 апреля 2020

Я вижу так много людей, которые пытаются копировать или перемещать файлы в 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!");
        }
    }
...