Wednesday, April 19, 2017

client object model - CSOM move the files one folder another folder - SharePoint Stack Exchange

client object model - CSOM move the files one folder another folder - SharePoint Stack Exchange:



There is no built-in method in SharePoint CSOM API for moving Folder with Files from one location into another.
The following solution demonstrates how to move files from source folder into destination folder:
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
        ctx.Web.EnsureFolder(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);
        }
    }

}

static class WebExtensions
{
    /// <summary>
    /// Ensures whether the folder exists   
    /// </summary>
    /// <param name="web"></param>
    /// <param name="folderUrl"></param>
    /// <returns></returns>
    public static Folder EnsureFolder(this Web web, string folderUrl)
    {
        return EnsureFolderInternal(web.RootFolder, folderUrl);
    }


    private static Folder EnsureFolderInternal(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 EnsureFolderInternal(folder, subFolderUrl);
        }
        return folder;
    }
}
Key points:
  • allows to ensure whether destination folder(s) exists
  • In case of nested folders, its structure is preserved while moving files
Usage
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();
}


'via Blog this'

No comments:

Post a Comment