有没有办法从listitem1获取文件夹对象



我试图在SharePoint 2010客户端应用程序中使用客户端对象模型(。Net 4.0)。

我需要检查由'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 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();

但是在这两种情况下我都得到了一个Exception:

第一个:'字段或属性'Folder'不存在。'

2: '列'文件夹'不存在。它可能已被其他用户删除。

有办法吗?也许是我做错了什么?提前感谢您的帮助

这实际上取决于使用的是哪个版本的SharePoint

SharePoint 2013

在SharePoint 2013 CSOM列表项。Folder属性获取与文件夹项关联的文件夹对象。

SharePoint 2010

在SharePoint 2010 CSOM文件夹属性是暴露的ListItem对象

可以使用以下方法检索与ListItem关联的Folder:

/// <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);
      }
}