sharepoint 2010 - SharePoint.Client Obtenga todas las carpetas recursivamente
sharepoint-2010 sharepoint-clientobject (1)
Me gustaría llamar a clientContext.ExecuteQuery () una vez para que un sitio mejore el rendimiento.
Las colecciones de cosas que deseo cargar incluyen todas las carpetas y archivos para todas las bibliotecas de documentos dentro del sitio. Cuando digo TODO, realmente quiero decir TODO. es decir, si hay carpetas dentro de las carpetas, dentro de las carpetas, las quiero todas de una vez. ¿Es esto posible o tengo que seguir cargando recursivamente cada carpeta secundaria y cargando sus carpetas y archivos de forma explícita?
Lo que tengo ahora que obtiene las carpetas de nivel básico y recursivamente obtiene el resto:
private static void SharePoint()
{
var clientContext = new ClientContext(@"http://myURL")
{
Credentials = System.Net.CredentialCache.DefaultCredentials
};
var web = clientContext.Web;
clientContext.Load(web);
clientContext.Load(web.Folders);
clientContext.Load(web.Lists, lists => lists.Include(l => l.ContentTypes.Include(c => c.Fields),
l => l.BaseType,
l => l.Hidden,
l => l.RootFolder,
l => l.RootFolder.Files.Include(fi => fi.ListItemAllFields,
fi => fi.ListItemAllFields.ContentType,
fi => fi.Name),
l => l.RootFolder.Folders,
l => l.Title));
clientContext.ExecuteQuery();
var documentLibraries = web.Lists.ToList().Where(l => l.BaseType == BaseType.DocumentLibrary && !l.Hidden).ToList();
foreach (var folder in documentLibraries.SelectMany(documentLibrary => documentLibrary.RootFolder.Folders.ToList().Where(fo => fo.Name != "Forms")))
{
LoadFolders(clientContext, folder);
}
}
private static void LoadFolders(ClientContext clientContext, Folder folder)
{
clientContext.Load(folder.Files, files => files.Include(fi => fi.ListItemAllFields,
fi => fi.ListItemAllFields.ContentType,
fi => fi.Name));
clientContext.Load(folder.Folders);
clientContext.ExecuteQuery();
foreach (var childFolder in folder.Folders)
{
LoadFolders(clientContext, childFolder);
}
}
Como SharePoint CSOM admite el procesamiento por lotes de solicitudes, puede considerar el siguiente enfoque para recuperar contenido web (archivos y carpetas):
public static void LoadContent(Web web, out Dictionary<string, IEnumerable<Folder>> listsFolders, out Dictionary<string, IEnumerable<File>> listsFiles)
{
listsFolders = new Dictionary<string, IEnumerable<Folder>>();
listsFiles = new Dictionary<string, IEnumerable<File>>();
var listsItems = new Dictionary<string, IEnumerable<ListItem>>();
var ctx = web.Context;
var lists = ctx.LoadQuery(web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary));
ctx.ExecuteQuery();
foreach (var list in lists)
{
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
ctx.Load(items, icol => icol.Include(i => i.FileSystemObjectType, i => i.File, i => i.Folder));
listsItems[list.Title] = items;
}
ctx.ExecuteQuery();
foreach (var listItems in listsItems)
{
listsFiles[listItems.Key] = listItems.Value.Where(i => i.FileSystemObjectType == FileSystemObjectType.File).Select(i => i.File);
listsFolders[listItems.Key] = listItems.Value.Where(i => i.FileSystemObjectType == FileSystemObjectType.Folder).Select(i => i.Folder);
}
}
Uso
using (var ctx = new ClientContext(webUrl))
{
Dictionary<string, IEnumerable<Folder>> listsFolders;
Dictionary<string, IEnumerable<File>> listsFiles;
LoadContent(ctx.Web,out listsFolders,out listsFiles);
}