簡體   English   中英

使用客戶端對象模型在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對象。

基於您的示例的一些建議:

  • 由於不需要內容類型屬性,因此可以省略獲取文件夾內容類型的第一個請求。
  • 在此示例中,不需要加載列表內容類型列表對象。

話雖如此,下面提供了用於創建文件夾的修改示例:

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支持請求批處理 ,因此可以創建多個文件夾,如下所示:

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

在這種情況下,只有一個請求將提交給服務器。

這很容易。 只需將要創建的所有文件夾添加到列表中,然后在運行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代碼之前暫存所有文件夾路徑/名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM