Sharepoint 2010 客户端以递归方式获取所有文件夹
我想为一个站点调用clientContext.ExecuteQuery()一次,以提高性能 我要加载的内容集合包括站点中所有文档库的所有文件夹和文件。当我说全部的时候,我真的是指全部。i、 e.如果文件夹中有文件夹,在文件夹中,我希望一次完成所有文件夹。这是可能的,还是我必须坚持递归加载每个子文件夹并显式加载其文件夹和文件 我现在所拥有的是获取基本级别文件夹并递归获取其余文件夹:Sharepoint 2010 客户端以递归方式获取所有文件夹,sharepoint-2010,sharepoint-clientobject,Sharepoint 2010,Sharepoint Clientobject,我想为一个站点调用clientContext.ExecuteQuery()一次,以提高性能 我要加载的内容集合包括站点中所有文档库的所有文件夹和文件。当我说全部的时候,我真的是指全部。i、 e.如果文件夹中有文件夹,在文件夹中,我希望一次完成所有文件夹。这是可能的,还是我必须坚持递归加载每个子文件夹并显式加载其文件夹和文件 我现在所拥有的是获取基本级别文件夹并递归获取其余文件夹: private static void SharePoint() { var clientContext =
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);
}
}
由于SharePoint CSOM支持,您可以考虑以下方法来检索Web内容(文件和文件夹):
publicstaticvoidloadcontent(Web站点、out字典列表文件夹、out字典列表文件)
{
listsFolders=新字典();
listsFiles=新字典();
var listsItems=新字典();
var ctx=web.Context;
var lists=ctx.LoadQuery(web.lists.Where(l=>l.BaseType==BaseType.DocumentLibrary));
ctx.ExecuteQuery();
foreach(列表中的变量列表)
{
var items=list.GetItems(CamlQuery.CreateAllItemsQuery());
Load(items,icol=>icol.Include(i=>i.FileSystemObjectType,i=>i.File,i=>i.Folder));
listsItems[list.Title]=项目;
}
ctx.ExecuteQuery();
foreach(listsItems中的var listItems)
{
listsFiles[listItems.Key]=listItems.Value.Where(i=>i.FileSystemObjectType==FileSystemObjectType.File)。选择(i=>i.File);
listsFolders[listItems.Key]=listItems.Value.Where(i=>i.FileSystemObjectType==FileSystemObjectType.Folder)。选择(i=>i.Folder);
}
}
用法
使用(var ctx=newclientcontext(webUrl))
{
字典列表文件夹;
字典列表文件;
加载内容(ctx.Web、输出列表文件夹、输出列表文件);
}
CAML查询可能是一个不错的选择-你运气好吗?这会使文件夹结构变得平坦。知道如何避免吗?@Mzn,确实知道,但文件夹对象包含有关文件夹路径的信息。也许创建一个单独的问题是有意义的,我和其他人会研究这个问题。有没有办法只返回文件夹和子文件夹,而不返回文件?我只需要根目录中的文件夹结构。
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);
}
}
using (var ctx = new ClientContext(webUrl))
{
Dictionary<string, IEnumerable<Folder>> listsFolders;
Dictionary<string, IEnumerable<File>> listsFiles;
LoadContent(ctx.Web,out listsFolders,out listsFiles);
}