如何使用CamlQuery根据文件夹名称获取SharePoint文件夹

4

我需要在插件中更改一个SharePoint文件夹的名称,该文件夹的名称是联系人的全名,但如果名称有错误,则需要有一个插件来在SharePoint中更改文件夹名称。我找到了一种方法来实现这个目标,但是为了完成此操作,我需要使用CamlQuery获取文件夹。(这是SharePoint 2010)

以下是我获取文件夹的步骤:

            ClientContext clientContext = new ClientContext(siteUrl);
            clientContext.Credentials = new NetworkCredential(login, password);
            Web web = clientContext.Web;
            List list = web.Lists.GetByTitle(listName);

            string FolderFullPath = siteUrl + "contact/" + folderName;

            CamlQuery query = new CamlQuery();
            query.ViewXml = "<View Scope=\"RecursiveAll\"> " +
                            "<Query>" +
                                "<Where>" +
                                    "<And>" +
                                        "<Eq>" +
                                            "<FieldRef Name=\"FSObjType\" />" +
                                            "<Value Type=\"Integer\">1</Value>" +
                                         "</Eq>" +
                                          "<Eq>" +
                                            "<FieldRef Name=\"Title\"/>" +
                                            "<Value Type=\"Text\">" + folderName + "</Value>" +
                                          "</Eq>" +
                                    "</And>" +
                                 "</Where>" +
                            "</Query>" +
                            "</View>";

            if (relativePath.Equals(string.Empty))
            {
                query.FolderServerRelativeUrl = "/lists/" + listName;
            }
            else
            {
                query.FolderServerRelativeUrl = "/lists/" + listName + "/" + relativePath;
            }
            var folders = list.GetItems(query);

            clientContext.Load(list);
            clientContext.Load(list.Fields);
            clientContext.Load(folders, fs => fs.Include(fi => fi["Title"],
                fi => fi["DisplayName"],
                fi => fi["FileLeafRef"]));
            clientContext.ExecuteQuery();

但我一直收到错误信息:“值不在预期范围内”。
以下是日志:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Value does not fall within the expected range.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220891</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <KeyValuePairOfstringanyType>
      <d2p1:key>OperationStatus</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>
    </KeyValuePairOfstringanyType>
  </ErrorDetails>
  <Message>Value does not fall within the expected range.</Message>
  <Timestamp>2015-05-26T07:16:43.90779Z</Timestamp>
  <InnerFault i:nil="true" />

</OrganizationServiceFault>
1个回答

5

由于您正在使用SharePoint CSOM API,我建议您利用Web.GetFolderByServerRelativeUrl方法来获取位于指定服务器相对 URL 的文件夹对象。

示例

var folderUrl = "Lists/Discussions/2013"; //folder named 2013 located in Discussions list
using (var ctx = new ClientContext(webUri))
{
   var folder = ctx.Web.GetFolderByServerRelativeUrl(folderUrl);
   ctx.Load(folder);
   ctx.ExecuteQuery();
}

如何使用SharePoint 2010 CSOM API重命名文件夹

以下示例演示了如何重命名文件夹:

public static class FolderExtensions
{
    public static void RenameFolder(this Folder folder,string name)
    {
        var folderItem = folder.ListItemAllFields;
        folderItem["Title"] = name;
        folderItem["FileLeafRef"] = name;
        folderItem.Update();
    }

}

使用方法

var folder = ctx.Web.GetFolderByServerRelativeUrl(folderUrl);
folder.RenameFolder("Archive");  //<-set new folder name here
ctx.ExecuteQuery();

是的,我也考虑过这个问题,但这里的名称属性没有setter。因此,我将无法更改文件夹名称。 - el shorty
所以,如果你的目标是重命名一个文件夹,那么你可以查看更新后的答案 ;) - Vadim Gremyachev
我想使用你的代码,但好像缺少引用。我得到了以下错误信息:microsoft.sharepoint.client.folder 不包含 ListItemAllFields 的定义,并且找不到可接受第一个参数的扩展方法 'ListItemAllFields'。 我已将 Microsoft.sharepoint.client 和 Microsoft.sharepoint.client.runtime 的 dll 文件添加到我的项目中。 - el shorty
@elshorty,是的,引用没有丢失,该代码适用于SharePoint 2013及以上版本,而不适用于OP标记的SharePoint 2010。 - oshirowanen
这个页面是谷歌搜索“sharepoint caml query get folder by name”的顶部结果,但实际上并没有回答问题。我们能否得到一个直接回答问题的答案,或者修改原始问题以匹配答案? - hamboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接