2014-10-11 7 views
4

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

Например, мы имеем папку для проекта (скажем, 12345), и это URL является

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

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

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

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

ответ

7

В 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(); 
} 
+1

Спасибо! Я попробую это позже сегодня и обеспечим обратную связь, очень ценю помощь – ebooyens

+1

Большое спасибо @ vadim-gremyachev, работает прямо! Должен сказать, что я никогда бы не смог придумать что-нибудь отдаленно близко к этому, еще раз спасибо! – ebooyens

+0

Замечательно и приятно знать! :) –