Sharepoint: Moving Document Set To Another Document Library In Same Site

Problem

Moving document set from one document Library to another document library in the same site [SharePoint Online]/SharePoint 2016 using CSOM is an issue. The OOTB solution is not available to move document set from one library to another library. Move / copy action from "Site Content and Feature" is not worked for the Document set. Move/Copy Items are only supported only for file and items.

Resolution

Microsoft latest CSOM Package Version 16.1.4727.1200 has addressed following issues and latest features.

Released Date:  Updated on 18th of Dec 2015  

URL to download:

https://dev.office.com/blogs/new-sharepoint-csom-version-released-for-Office-365

Using this new DLL, we can export the document set and from the source document library to target library.

Sample Code

USING CSOM (.NET)

using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using Microsoft.SharePoint.Client;  
using Microsoft.SharePoint.Client.DocumentSet;  
namespace DocSetCSOM {  
    class Program {  
        static void  Main(string[] args) {  
            if (args.Length != 2) {  
                Console.WriteLine("Usage: DocSetCSOM.exe <newDocSetName> <docSetContentTypeName>");  
                return;  
            }  
            ClientContext context = new  ClientContext("URL");  
            ContentTypeCollection contentTypes = context.Web.ContentTypes;  
            context.Load(contentTypes);  
            context.ExecuteQuery();  
            ContentType docSetContentType = null;  
            foreach(ContentType ct in  contentTypes) {  
                if (ct.Name == args[1]) {  
                    docSetContentType = ct;  
                    break;  
                }  
            }  
            List list = context.Web.Lists.GetByTitle("Documents");  
            List target = context.Web.Lists.GetByTitle("target");  
            Folder folder = context.Web.GetFolderByServerRelativeUrl("target/xyz");  
            ListItem listItem = list.GetItemById(2);  
            DocumentSet docSet = DocumentSet.GetDocumentSet(context, listItem.Folder);  
            ClientArrayResult < byte  > data = docSet.ExportDocumentSet();  
            context.ExecuteQuery();  
            DocumentSet newDocSet = DocumentSet.ImportDocumentSet(context, data.Value, args[0], folder, docSetContentType.Id, context.Web.CurrentUser);  
            context.ExecuteQuery();  
            Console.WriteLine("Done");  
        }  
    }  
}

Using Server Side Code

static void  Main(string[] args) {  
    PSite site = new  SPSite("Site"))  //Get the site  
{  
    using(SPWeb web = site.RootWeb) //Get the web  
    {  
        SPList list = web.Lists["My documents"]; //Get the list  
        SPFolder folder = list.RootFolder; //Find the folder to create in  
        SPContentType docsetCT = list.ContentTypes["Document Set"]; //Find the content type to use  
        Hashtable properties = new  Hashtable(); //Create the properties hashtable   
        properties.Add("DocumentSetDescription", "New Document Set"); //Populate the properties  
        foreach(SPListItem item in  list.Items) {  
            if (item.Folder != null) {  
                DocumentSet newDocset = DocumentSet.GetDocumentSet(item.Folder);  
                if (newDocset != null) {  
                    //Now we'll export it so we can create an exact copy of it somewhere else  
                    byte[] compressedFile = newDocset.Export();  
                    //Then we get the target list  
                    SPList targetList = web.Lists["NewDocumentLib"];  
                    SPContentType secondCt = targetList.ContentTypes["Document Set"];  
                    SPFolder targetFolder = targetList.RootFolder;  
                    DocumentSet.Import(compressedFile, item.Name + "Backup", targetFolder, secondCt.Id, properties, web.CurrentUser);  
                }  
            }  
        }  
    }  
}  
}