【问题标题】:Creating Folders programmatically in SharePoint 2013在 SharePoint 2013 中以编程方式创建文件夹
【发布时间】:2014-02-24 23:17:02
【问题描述】:

目前我有代码在运行时在Documents 目录中创建一个文件夹:

using (var context = new Microsoft.SharePoint.Client.ClientContext(sharePointSite))
{
    context.Credentials = new Microsoft.SharePoint.Client.SharePointOnlineCredentials(user, password);

    Web web = context.Web;

    Microsoft.SharePoint.Client.List docs = web.Lists.GetByTitle(<upper level folder>);
    docs.EnableFolderCreation = true;

    docs.RootFolder.Folders.Add(folderName);

    context.ExecuteQuery();

    return true;
}

我在使用此代码创建的文件夹中创建子文件夹时遇到问题。因此,如果我想在Documents 下创建一个名为Feb 的文件夹,就可以这样做。但是如果我想在新文件夹Feb 下创建一个名为Week 2 的文件夹。它不会那样做。我收到此错误:

{"List 'Feb' does not exist at site with URL 'https://my.sharepoint.com/sites/labels'."}

我意识到问题可能出在docs.RootFolder.Folders.Add(folderName); 上,因为Feb 不是根文件夹,当它查找它时会抛出异常。

所以我希望有人可以帮助我使用一些代码来将子文件夹添加到已创建的文件夹中。我正在使用 Visual Stuidos 2010,否则无法升级到 2012。我有可以在 VS 2010 中引用的 2013 Microsoft.Sharepoint.Client dll。

【问题讨论】:

    标签: c# sharepoint-2013 csom


    【解决方案1】:

    如何在 SharePoint 2010/2013 中通过 CSOM 创建文件夹(包括嵌套)

    /// <summary>
    /// Create Folder client object
    /// </summary>
    /// <param name="web"></param>
    /// <param name="listTitle"></param>
    /// <param name="fullFolderUrl"></param>
    /// <returns></returns>
    public static Folder CreateFolder(Web web, string listTitle, string fullFolderUrl)
    {
        if (string.IsNullOrEmpty(fullFolderUrl))
            throw new ArgumentNullException("fullFolderUrl");
        var list = web.Lists.GetByTitle(listTitle);
        return CreateFolderInternal(web, list.RootFolder, fullFolderUrl);
    }
    
    private static Folder CreateFolderInternal(Web web, Folder parentFolder, string fullFolderUrl)
    {
        var folderUrls = fullFolderUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        string folderUrl = folderUrls[0];
        var curFolder = parentFolder.Folders.Add(folderUrl);
        web.Context.Load(curFolder);
        web.Context.ExecuteQuery();
    
        if (folderUrls.Length > 1)
        {
            var subFolderUrl = string.Join("/", folderUrls, 1, folderUrls.Length - 1);
            return CreateFolderInternal(web, curFolder, subFolderUrl);
        }
        return curFolder;
    }
    

    用法

     using (var ctx = new ClientContext("https://contoso.onmicrosoft.com/"))
     {
           ctx.Credentials = new Microsoft.SharePoint.Client.SharePointOnlineCredentials("username", "password");
           var folder = CreateFolder(ctx.Web, "Shared Documents", "FolderA/SubFolderA/SubSubFolderA");
     }
    

    如何获取文件夹客户端对象

    public static Folder GetFolder(Web web, string fullFolderUrl)
    {
        if (string.IsNullOrEmpty(fullFolderUrl))
            throw new ArgumentNullException("fullFolderUrl");
    
        if (!web.IsPropertyAvailable("ServerRelativeUrl"))
        {
            web.Context.Load(web,w => w.ServerRelativeUrl);
            web.Context.ExecuteQuery();
        }
        var folder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + fullFolderUrl);
        web.Context.Load(folder);
        web.Context.ExecuteQuery();
        return folder;
    }
    

    用法

    var existingFolder = GetFolder(ctx.Web, "Shared Documents/FolderA/SubFolderA/SubSubFolderA");
    

    【讨论】:

    • Vadim,您的解决方案运行良好。不过,我有一个跟进,我将如何访问像“共享文档/文件夹 A”这样的文件夹。我收到一条错误消息,指出它在 sharepoint 站点上不存在。因为我想上传一个文件到子文件夹A,我需要访问它。
    • 布雷特,我很高兴它有帮助。答案已更新以反映获取文件夹客户端对象的情况。在您的评论中,我猜有一个错字:Share Documents -> Shared Documents
    • 在出现 401、未经授权的错误时要检查哪些 SharePoint 权限?
    【解决方案2】:

    您可以像这样创建文件夹:

    Microsoft.SharePoint.Client.List docs = web.Lists.TryGetList("upper level folder");
    FolderCollection folderColl = docs.RootFolder.SubFolders;
    Folder newFolder = folderColl.Add("upper level folder/Feb/Week 2");
    

    【讨论】:

    • 我似乎找不到GetTryGetList
    • 这是因为该方法称为“TryGetList”而不是“GetTryGetList”。我尝试编辑帖子,但更正的字符数太少。
    【解决方案3】:

    要在快速链接列表中的已知特定节点之后添加文件夹,请尝试以下操作:

    ClientContext context = new ClientContext("https://companySP.com/sites/RootSite");
    NetworkCredential _myCredentials = new NetworkCredential(userName, password);
    
    context.AuthenticationMode = ClientAuthenticationMode.Default;
    context.Credentials = _myCredentials;
    context.Load(context.Web, w => w.Title);
    context.ExecuteQuery();
    Console.WriteLine($"Connected to {context.Web.Title}");
    /*  Connection made to Sharepoint Site  */
    
    NavigationNodeCollection ql = context.Web.Navigation.QuickLaunch;
    context.Load(ql);
    context.ExecuteQuery();
    Console.WriteLine("Current nodes:\n");
    NavigationNode addAfterNode = null;
    foreach (NavigationNode navNode in ql)
    {
       Console.WriteLine(navNode.Title + " - " + navNode.Url);
       if (navNode.Title == "Existing List Name In Quicklinks")
       {
          addAfterNode = navNode;
          break;
       }
    }
    /*  Navigation Node Found to Add After in Quick Links  */
    
    NavigationNodeCreationInformation nnci = new NavigationNodeCreationInformation();
    nnci.Title = "New List Title";
    nnci.Url = "URL of New List Title";
    
    nnci.PreviousNode = addAfterNode;  // Sets the previous node to add after
    ql.Add(nnci);
     
    context.Load(ql);
    context.ExecuteQuery();
    
    context.Web.Update();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多