2014-10-11 73 views
4

我正在尋找一種方法來將文件夾及其所有內容移動到同一個庫中的不同位置,使用SharePoint 2010的客戶端對象模型(C#) 。移動一個SharePoint文件夾和內容到同一個文檔庫中的不同位置

例如,我們有一個文件夾的項目(比如12345),它的網址是

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

,其中2012代表一年。我想以編程方式將12345文件夾移到不同的年份,比如2014年,可能已經存在但可能不存在。

我已經搜遍了,但我得到的解決方案似乎非常複雜,並將文件夾移動到不同的網站集,我希望因爲它在同一個庫中可能有一個更簡單的解決方案?我有一個想法是依靠資源管理器視圖而不是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; 
    } 
} 

要點:

  • 允許確保目標文件夾(S)是否存在
  • 萬一嵌套文件夾的結構在移動文件時保留

使用

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 2014-10-12 10:07:06

+1

非常感謝@ vadim-gremyachev,能夠正確地工作!必須說,我永遠不可能拿出任何遠近接近的東西,再次感謝! – ebooyens 2014-10-12 20:46:10

+0

非常好,知道! :) – 2014-10-13 09:28:18

相關問題