Pregunta

Estoy intentando crear carpetas anidadas en mi biblioteca de documentos para que se vea así:

http://site/PublicDocuments/Folder1/Folder2/Folder3/

La biblioteca de documentos "Documentos públicos" existe pero aún no existe ninguna de las carpetas.

Aquí está el código de trabajo para aquellos interesados:

    ClientContext clientContext = new ClientContext(url);
    Web web = clientContext.Web;
    var query = clientContext.LoadQuery(web.Lists.Where(p => p.Title == "Public Documents"));
    clientContext.ExecuteQuery();
    List list = query.FirstOrDefault();
    var folder = list.RootFolder;

    clientContext.Load(folder);
    clientContext.ExecuteQuery();

    string[] namesArray = new string[] { "/Folder1", "Folder2", "Folder3" };
    foreach(string name in namesArray)
    {
        folder = folder.Folders.Add(name);            
    }

    clientContext.ExecuteQuery();

¡Gracias!

¿Fue útil?

Solución

Intenta no llamar clientContext.Load, por ejemplo esto funciona para mí:

var folder = list.RootFolder;
clientContext.Load(folder);
clientContext.ExecuteQuery();
folder = folder.Folders.Add("Folder 1");
folder.Folders.Add("Folder 2");
clientContext.ExecuteQuery();

Otros consejos

Cómo crear una carpeta (incluido anidado) a través de CSOM en SharePoint
/// <summary>
/// Create Folder (including nested) client object
/// </summary>
/// <param name="web"></param>
/// <param name="listTitle"></param>
/// <param name="fullFolderPath"></param>
/// <returns></returns>
public static Folder CreateFolder(Web web, string listTitle, string fullFolderPath)
{
    if (string.IsNullOrEmpty(fullFolderPath))
        throw new ArgumentNullException("fullFolderPath");
    var list = web.Lists.GetByTitle(listTitle);
    return CreateFolderInternal(web, list.RootFolder, fullFolderPath);
}


private static Folder CreateFolderInternal(Web web, Folder parentFolder, string fullFolderPath)
{
    var folderUrls = fullFolderPath.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 folderPath = string.Join("/", folderUrls, 1, folderUrls.Length - 1);
        return CreateFolderInternal(web, curFolder, folderPath);
    }
    return curFolder;
}

Uso

 using (var ctx = new ClientContext("https://contoso.intranet.com/"))
 {
       var folder = CreateFolder(ctx.Web, "Shared Documents", "FolderA/SubFolderA/SubSubFolderA");
 }

¿Qué tal algo como esto:

 public static Folder EnsureFolder(ClientContext ctx, Folder ParentFolder, string FolderPath)
    {
        //Split up the incoming path so we have the first element as the a new sub-folder name 
        //and add it to ParentFolder folders collection
        string[] PathElements = FolderPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);           
        string Head = PathElements[0];
        Folder NewFolder = ParentFolder.Folders.Add(Head);
        ctx.Load(NewFolder);
        ctx.ExecuteQuery();

        //If we have subfolders to create then the length of PathElements will be greater than 1
        if (PathElements.Length > 1)
        {
            //If we have more nested folders to create then reassemble the folder path using what we have left i.e. the tail
            string Tail = string.Empty;
            for (int i = 1; i < PathElements.Length; i++)
                Tail = Tail + "/" + PathElements[i];

            //Then make a recursive call to create the next subfolder
            return EnsureFolder(ctx, NewFolder, Tail);
        }
        else
            //This ensures that the folder at the end of the chain gets returned
            return NewFolder;            
    }

y luego puedes llamarlo siguiendo:

ctx.Load(TargetList.RootFolder);
ctx.ExecuteQuery();
Folder NewFolder = EnsureFolder(ctx, TargetList.RootFolder, "/Folder1/Folder2/Folder3");

var list = ctx.GetListByTitle("MyList); list.EnableFolderCreation = true; list.RootFolder.EnsureFolder("NewFolder1").EnsureFolder("NewSubFolderToFolder1"); ctx.ExecuteQuery();

intente bucle a través y agregar cada carpeta y luego llamar a ExecuteQuery

      string[] namesArray = new string[] {  "Folder1","Folder2"};
      foreach (string name in namesArray)
       {
        //Add Folder
        var folders = list.RootFolder.Folders;
        clientContext.Load(folders);
        clientContext.ExecuteQuery();
        var newFolder = folders.Add(name);
      }
      //Execute request
      clientContext.ExecuteQuery();

Utilice el siguiente código simple.

 public void CreateFolder(string url, string foldername,string documentlibname)
    {
        try
        {
            ClientContext clientContext = new ClientContext(url);
            Web web = clientContext.Web;
            var query = clientContext.LoadQuery(web.Lists.Where(p => p.Title == documentlibname));## Heading ##
            clientContext.ExecuteQuery();
            List list = query.FirstOrDefault();
            var folder = list.RootFolder;
            clientContext.Load(folder);
            clientContext.ExecuteQuery();
            string[] PathElements = foldername.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < PathElements.Length; i++)
            {
                folder = folder.Folders.Add(PathElements[i].ToString());
                clientContext.ExecuteQuery();
            }



            //folder = folder.Folders.Add(foldername);
            //clientContext.ExecuteQuery();
        }
        catch (System.Exception ex)
        {

            throw;
        }
    }

Licenciado bajo: CC-BY-SA con atribución
scroll top