使用客户端对象模型在 SharePoint 文档库上创建文件夹
Create folder on SharePoint document library using client object model
我想使用客户端对象模型 (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 对象。
根据您的示例提出的一些建议:
- 由于内容类型 属性 不是必需的,因此第一个请求
可以省略获取文件夹内容类型。
- 在此示例中,无需加载 list 内容类型 和 list 对象。
话虽如此,下面提供了创建文件夹的修改示例:
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();
}
In that case only a single request will be submitted to the server.
很简单。只需将您希望创建的所有文件夹添加到列表中,然后遍历列表并在 运行 执行 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 代码之前暂存所有文件夹 paths/names。
我想使用客户端对象模型 (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 对象。
根据您的示例提出的一些建议:
- 由于内容类型 属性 不是必需的,因此第一个请求 可以省略获取文件夹内容类型。
- 在此示例中,无需加载 list 内容类型 和 list 对象。
话虽如此,下面提供了创建文件夹的修改示例:
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();
}
In that case only a single request will be submitted to the server.
很简单。只需将您希望创建的所有文件夹添加到列表中,然后遍历列表并在 运行 执行 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 代码之前暂存所有文件夹 paths/names。