Nano Hash - криптовалюты, майнинг, программирование

Перемещение папки и содержимого SharePoint в другое место в той же библиотеке документов

Я ищу способ переместить папку и все ее содержимое в другое место в той же библиотеке, используя клиентскую объектную модель для SharePoint 2010 (C#).

Например, у нас есть папка для проекта (скажем, 12345), и ее URL-адрес

http://sharepoint/site/library/2012/12345

где 2012 представляет год. Я хотел бы программно переместить папку 12345 в другой год, скажем, в 2014, который, вероятно, уже существует, но может и не существовать.

Я искал, но решения, которые я получаю, кажутся чрезвычайно сложными и актуальными для перемещения папок в разные семейства сайтов, я надеюсь, что, поскольку они находятся в той же библиотеке, может быть более простое решение? У меня есть одна идея — полагаться на Explorer View вместо CSOM?

Большое спасибо!

11.10.2014

Ответы:


1

В SharePoint CSOM API нет встроенного метода для перемещения папки с файлами из одного места в другое.

Следующий класс представляет, как перемещать файлы из исходной папки в папку назначения:

public static class FolderExtensions
{


    public static void MoveFilesTo(this Folder folder, string folderUrl)
    {
        var ctx = (ClientContext)folder.Context;
        if (!ctx.Web.IsPropertyAvailable("ServerRelativeUrl"))
        {
            ctx.Load(ctx.Web, w => w.ServerRelativeUrl);   
        }
        ctx.Load(folder, f => f.Files, f => f.ServerRelativeUrl, f => f.Folders);
        ctx.ExecuteQuery();

        //Ensure target folder exists
        EnsureFolder(ctx.Web.RootFolder, folderUrl.Replace(ctx.Web.ServerRelativeUrl, string.Empty));
        foreach (var file in folder.Files)
        {
            var targetFileUrl = file.ServerRelativeUrl.Replace(folder.ServerRelativeUrl, folderUrl);
            file.MoveTo(targetFileUrl, MoveOperations.Overwrite);
        }
        ctx.ExecuteQuery();

        foreach (var subFolder in folder.Folders)
        {
            var targetFolderUrl = subFolder.ServerRelativeUrl.Replace(folder.ServerRelativeUrl,folderUrl);
            subFolder.MoveFilesTo(targetFolderUrl);
        }
    }


    public static Folder EnsureFolder(Folder parentFolder, string folderUrl)
    {
        var ctx = parentFolder.Context;
        var folderNames = folderUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        var folderName = folderNames[0];
        var folder = parentFolder.Folders.Add(folderName);
        ctx.Load(folder);
        ctx.ExecuteQuery();

        if (folderNames.Length > 1)
        {
            var subFolderUrl = string.Join("/", folderNames, 1, folderNames.Length - 1);
            return EnsureFolder(folder, subFolderUrl);
        }
        return folder;
    }
}

Ключевые моменты:

  • позволяет убедиться, что папки назначения существуют
  • В случае вложенных папок их структура сохраняется при перемещении файлов

Использование

var srcFolderUrl = "/news/pages";
var destFolderUrl = "/news/archive/pages";
using (var ctx = new ClientContext(url))
{      
    var sourceFolder = ctx.Web.GetFolderByServerRelativeUrl(srcFolderUrl);
    sourceFolder.MoveFilesTo(destFolderUrl);
    sourceFolder.DeleteObject(); // delete source folder if nessesary
    ctx.ExecuteQuery();
}
11.10.2014
  • Перемещение файлов работает, кроме перемещения вложенных папок. SharePoint выдает исключение «Файл не найден». Хотелось бы, чтобы это работало и для папок, если у вас есть пример. 29.07.2016
  • это все еще действительно для SharePoint 2013 CSOM? может ли кто-нибудь предоставить статью о том, что перемещение папки (или набора документов) не поддерживается 06.12.2018

  • 2

    На всякий случай кому-то нужно перевести это на PnP PowerShell. Это не проверено в бою, но работает для меня. Версии и метаданные также перемещались в пределах одной библиотеки.

    $list = Get-PnPList -Identity Documents
    $web = $list.ParentWeb
    $folder = Ensure-PnPFolder -Web $list.ParentWeb -SiteRelativePath "Shared Documents/MoveTo"
    $tofolder = Ensure-PnPFolder -Web $list.ParentWeb -SiteRelativePath "Shared Documents/MoveTwo"
    
    function MoveFolder
    {
        [cmdletbinding()]
        Param (
            $web,
            $fromFolder,
            $toFolder
        )
        $fromFolder.Context.Load($fromFolder.Files)
        $fromFolder.Context.Load($fromFolder.Folders)
        $fromFolder.Context.ExecuteQuery()
        foreach ($file in $fromFolder.Files)
        {
            $targetFileUrl = $file.ServerRelativeUrl.Replace($fromFolder.ServerRelativeUrl, $toFolder.ServerRelativeUrl);
            $file.MoveTo($targetFileUrl, [Microsoft.SharePoint.Client.MoveOperations]::Overwrite);
        }
        $fromFolder.Context.ExecuteQuery();
    
        foreach ($subFolder in $fromFolder.Folders)
        {
            $targetFolderUrl = $subFolder.ServerRelativeUrl.Replace($fromFolder.ServerRelativeUrl, $toFolder.ServerRelativeUrl);
            $targetFolderRelativePath = $targetFolderUrl.SubString($web.RootFolder.ServerRelativeUrl.Length)
            $tofolder = Ensure-PnPFolder -Web $list.ParentWeb -SiteRelativePath $targetFolderRelativePath
            MoveFolder -Web $web -fromFolder $subFolder -toFolder $tofolder
        }
    }
    
    $web.Context.Load($web.RootFolder)
    $web.Context.ExecuteQuery()
    MoveFolder -Web $web -fromFolder $folder -toFolder $tofolder
    $folder.DeleteObject()
    $web.Context.ExecuteQuery()
    
    04.04.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..