使用客户端对象模型在SharePoint文档库上创建文件夹

时间:2015-07-02 04:33:41

标签: c# sharepoint sharepoint-clientobject

我想使用客户端对象模型(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对象。

2 个答案:

答案 0 :(得分:7)

基于您的示例的一些建议:

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

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

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

在这种情况下,只有一个请求将提交给服务器。

答案 1 :(得分:6)

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

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

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