【问题标题】:Create folder on SharePoint document library using client object model使用客户端对象模型在 SharePoint 文档库上创建文件夹
【发布时间】:2015-07-02 04:33:41
【问题描述】:

我想使用客户端对象模型 (C#) 在 SharePoint 文档库上创建文件夹。下面是执行此操作的代码。

 ContentTypeCollection listContentTypes = list.ContentTypes;
 clientContext.Load(listContentTypes, types => types.Include
                                     (type => type.Id, type => type.Name,
                                     type => type.Parent));

 var result = clientContext.LoadQuery(listContentTypes.Where(c => c.Name == "Folder"));

clientContext.ExecuteQuery();

ContentType folderContentType = result.FirstOrDefault();

ListItemCreationInformation newItemInfo = new ListItemCreationInformation();
newItemInfo.UnderlyingObjectType = FileSystemObjectType.Folder;
newItemInfo.LeafName = Foldername;
ListItem newListItem = list.AddItem(newItemInfo);

newListItem["ContentTypeId"] = folderContentType.Id.ToString();
newListItem["Title"] = Foldername;
ewListItem.Update();

clientContext.Load(list);
clientContext.ExecuteQuery();

现在我在库中创建了数千个文件夹。 那么有没有其他方法我可以使用批量操作来做到这一点,所以客户端到服务器的连接只会被调用一次。

问题是创建文件夹花费了太多时间,因为对于每个文件夹,它都会调用 SharePoint 对象。

【问题讨论】:

    标签: c# sharepoint sharepoint-clientobject


    【解决方案1】:

    这很容易。只需将您希望创建的所有文件夹添加到列表中,然后遍历列表并在运行 ExecuteQuery 函数之前创建所有列表项:

            List<string> folderNames = new List<string>();
            folderNames.Add("Folder 1");
            folderNames.Add("Folder 2");
            folderNames.Add("Folder 3");
    
            ClientContext context = new ClientContext("https://sharepoint.Site/Test");
            List list = context.Web.Lists.GetByTitle("Documents");
            var folder = list.RootFolder;
            context.Load(folder);
            context.ExecuteQuery();
    
            foreach (string folderName in folderNames)
            {
                ListItemCreationInformation newItemInfo = new ListItemCreationInformation();
                newItemInfo.UnderlyingObjectType = FileSystemObjectType.Folder;
                newItemInfo.LeafName = folderName;
                ListItem newListItem = list.AddItem(newItemInfo);
                newListItem["Title"] = folderName;
                newListItem.Update();
            }
            context.ExecuteQuery();
    

    像魅力一样工作。在运行任何 CSOM 代码之前,您只需要暂存所有文件夹路径/名称。

    【讨论】:

    • 感谢 Arcan。这对我帮助很大。
    • 感谢此代码 sn-p,它完美运行。把我从泡菜中解救出来。传奇!
    【解决方案2】:

    根据您的示例提出的一些建议:

    • 由于不需要内容类型属性,第一次请求 可以省略获取文件夹内容类型。
    • 在此示例中,无需加载 list content typeslist 对象。

    话虽如此,下面提供了创建文件夹的修改示例:

    public static class ListExtensions
    {
        public static void CreateFolder(this List list, string name)
        {
            var info = new ListItemCreationInformation
            {
                UnderlyingObjectType = FileSystemObjectType.Folder,
                LeafName = name
            };
            var newItem = list.AddItem(info);
            newItem["Title"] = name;
            newItem.Update();
        }
    }
    

    用法

    using (var ctx = new ClientContext(webUri))
    {
        var list = ctx.Web.Lists.GetByTitle(listTitle);
        list.CreateFolder(folderName);
        ctx.ExecuteQuery();
    }
    

    关于批量操作,由于 SharePoint CSOM 支持Request Batching,因此可以创建多个文件夹,如下所示:

    using (var ctx = new ClientContext(webUri))
    {
        var list = ctx.Web.Lists.GetByTitle(listTitle);
        for (var year = 2000; year <= 2015; year++)
        {
           list.CreateFolder(year.ToString());
        }
        ctx.ExecuteQuery();
    }
    

    在这种情况下,只会向服务器提交一个请求。

    【讨论】:

    • 谢谢瓦迪姆。真的很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多