我正在尝试使用客户端对象模型(.Net 4.0)在SharePoint 2010客户端应用程序中通过其路径获取Folder对象。
我需要检查库中是否存在'folderPath'变量描述的文件夹,然后获取Folder对象以进行进一步的操作。为了提高性能,我选择使用CAML查询来过滤列表。
我的代码:
IEnumerable<List> library = this.clientContext.LoadQuery(
this.clientContext.Web.Lists.Where(p => p.Title == this.documentLibrary));
this.clientContext.ExecuteQuery();
List libraryList = library.FirstOrDefault();
//code to handle libraryList == null
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml =
"<View Scope=\"RecursiveAll\">" +
"<Query>" +
"<Where>" +
"<And>" +
"<Eq>" +
"<FieldRef Name=\"FSObjType\"/>" +
"<Value Type=\"Integer\">1</Value>" +
"</Eq>" +
"<Eq>" +
"<FieldRef Name=\"FileRef\" />" +
"<Value Type=\"Text\">" + folderPath + "</Value>" +
"</Eq>" +
"</And>" +
"</Where>" +
"</Query>" +
"</View>";
ListItemCollection items = libraryList.GetItems(camlQuery);
clientContext.Load(items);
clientContext.ExecuteQuery();
到目前为止一切正常。但我不知道如何从项目中获取“文件夹”对象。我试着这样做:
Folder folder = items.FirtsOrDefault().Folder;
clientContext.Load(folder);
clientContext.ExecuteQuery();
那样(用来代替第一个代码片段中的最后三行):
ListItemCollection items = libraryList.GetItems(camlQuery);
clientContext.Load(items, collection => collection.Include(item => item.Folder));
clientContext.ExecuteQuery();
但在这两种情况下我都有一个例外:
1st:'字段或属性'文件夹'不存在。'
第二名:'列'文件夹'不存在。它可能已被其他用户删除。'
有办法吗?或者也许我做错了什么?在此先感谢您的帮助。
答案 0 :(得分:6)
实际上取决于使用的是哪个版本的SharePoint。
在SharePoint 2013中,CSOM ListItem.Folder property获取与文件夹项关联的文件夹对象。
在SharePoint 2010中,CSOM文件夹属性为ListItem对象公开不。
以下方法可用于检索与Folder
相关联的ListItem
:
/// <summary>
/// Get Parent Folder for List Item
/// </summary>
/// <param name="listItem"></param>
/// <returns></returns>
private static Folder GetListItemFolder(ListItem listItem)
{
var folderUrl = (string)listItem["FileDirRef"];
var parentFolder = listItem.ParentList.ParentWeb.GetFolderByServerRelativeUrl(folderUrl);
listItem.Context.Load(parentFolder);
listItem.Context.ExecuteQuery();
return parentFolder;
}
示例:
using (var context = new ClientContext(webUrl))
{
var list = context.Web.Lists.GetByTitle(listTitle);
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
context.Load(items);
context.ExecuteQuery();
foreach (var item in items)
{
var folder = GetListItemFolder(item); //get Folder
Console.WriteLine(folder.Name);
}
}