Creación de carpetas anidadas mediante el modelo de objetos del cliente
-
09-12-2019 - |
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!
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;
}
/// <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
No afiliado a sharepoint.stackexchange