c# - 将 SharePoint 文件夹和内容移动到同一文档库中的不同位置

标签 c# sharepoint-2010 csom

我正在寻找一种使用 SharePoint 2010 客户端对象模型 (C#) 将文件夹及其所有内容移动到同一库中不同位置的方法。

例如,我们有一个项目文件夹(比如 12345),它的 URL 是

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

其中 2012 代表一年。我想以编程方式将 12345 文件夹移动到不同的年份,比如 2014 年,它可能已经存在但可能不存在。

我四处搜索,但我得到的解决方案似乎非常复杂,并且与将文件夹移动到不同的网站集相关,我希望因为它在同一个库中,所以可能有更简单的解决方案?我有一个想法是依赖 Explorer View 而不是 CSOM?

非常感谢!

最佳答案

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

关于c# - 将 SharePoint 文件夹和内容移动到同一文档库中的不同位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26317887/

相关文章:

c# - 如何从 asp.net 中的自定义 FileUpload 获取文件流?

sharepoint - 将文件上传到 Sharepoint 列表项

javascript - TypeError : this. $E_0.getElementsByTagName 不是函数

c# - 如何从共享点列表中获取所有文件夹和项目?

sharepoint-2013 - 使用 CSOM 安装 Sharepoint 应用程序

c# - 如何在 roslyn 语义模型中获取模块祖先?

c# - 检测 IEnumerable<T> 是否已分组,我在检查类型时得到了一些疯狂的结果

C# OpenFileDialog 线程启动但未显示对话框

SharePoint CSOM,检索网站集。限量300?

javascript - 使用javascript(ecmascript)获取列表的用户/组权限