web-dev-qa-db-fra.com

Création de dossiers par programmation dans SharePoint 2013

Actuellement, j'ai du code qui crée un dossier dans le répertoire Documents lors de son exécution:

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

J'ai des problèmes pour créer des sous-dossiers dans des dossiers que j'ai déjà créés à l'aide de ce code. Donc, comme si je voulais créer un dossier appelé Feb sous Documents, cela ferait cela. Mais si je voulais créer un dossier appelé Week 2 Sous le nouveau dossier Feb. Cela ne fera pas ça. Je reçois cette erreur:

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

Je me rends compte que le problème est probablement docs.RootFolder.Folders.Add(folderName); parce que Feb ne serait pas le dossier racine et quand il le chercherait une exception serait levée.

J'espérais donc que quelqu'un pourrait m'aider avec du code pour ajouter des sous-dossiers aux dossiers déjà créés. J'utilise Visual Stuidos 2010 et je ne peux pas passer à 2012 sinon je le ferais. J'ai les DLL Microsoft.Sharepoint.Client 2013 qui peuvent être référencées dans VS 2010.

13
B-M

Comment créer un dossier (y compris imbriqué) via CSOM dans 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;
}

Usage

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

Comment obtenir un objet client Folder

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

Usage

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

Vous pouvez créer des dossiers comme celui-ci:

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