在SharePoint 2013中以编程方式创建文件夹

14

目前我有一段代码,在运行时会在文档目录下创建一个文件夹:

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

我在使用这段代码创建文件夹后,无法在已创建的文件夹中创建子文件夹。比如说,如果我想在文档文件夹下创建一个名为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版本。我有2013年的Microsoft.Sharepoint.Client可供在VS 2010中引用。


3个回答

31

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

/// <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");

1
Vadim,你的解决方案完美地解决了我的问题。然而我有一个后续问题,如果我想访问类似于“共享文档/文件夹A”的文件夹,该怎么办呢?我收到了一个错误提示说它在SharePoint网站上不存在。因为我想上传一个文件到子文件夹A,所以我需要访问它。 - B-M
1
Brett,我很高兴能帮到你。答案已更新以反映获取文件夹客户端对象的情况。在您的评论中,我猜有一个错别字:Share Documents -> Shared Documents。 - Vadim Gremyachev
在出现401未授权错误的情况下,应检查哪些SharePoint权限? - VJOY

3
你可以这样创建文件夹:
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 - dotnetN00b
2
这是因为该方法被称为'TryGetList'而不是'GetTryGetList'。我尝试编辑帖子,但更正的字符数太少了。 - Stig Perez

0

如果想在QuickLinks列表中已知的特定节点后添加一个文件夹,请尝试以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接