【问题标题】:C# Sharepoint.Client - Return all files and folders from a given subfolderC# Sharepoint.Client - 返回给定子文件夹中的所有文件和文件夹
【发布时间】:2018-10-18 09:18:39
【问题描述】:

我正在尝试从给定的子文件夹开始返回 SharePoint 库中的所有文件和文件夹。

如果我将 CamlQuery 上的 FolderServerRelativeUrl 设置为我希望开始的文件夹,我可以获得该给定文件夹的所有列表项;但是,当我尝试添加 camlQuery.ViewXML 以递归返回带有任何其他子文件夹的项目时,我得到以下异常:

Microsoft.SharePoint.Client.ServerException: '尝试的操作被禁止,因为它超过了管理员强制执行的列表视图阈值。'

代码

public static IEnumerable<string> GetSharepointFiles2(string sharePointsite, string libraryName, string username, string password, string subFolders)
{
    Uri filename = new Uri(sharePointsite);
    string server = filename.AbsoluteUri.Replace(filename.AbsolutePath, "");
    List<string> fullfilePaths = new List<string>();

    using (ClientContext cxt = new ClientContext(filename))
    {
        cxt.Credentials = GetCreds(username, password);

        Web web = cxt.Web;
        cxt.Load(web, wb => wb.ServerRelativeUrl);
        cxt.ExecuteQuery();

        List list = web.Lists.GetByTitle(libraryName);
        cxt.Load(list);
        cxt.ExecuteQuery();

        Folder folder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + subFolders);
        cxt.Load(folder);
        cxt.ExecuteQuery();

        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml = @"<View Scope='RecursiveAll'>
                             <Query>
                             </Query>
                         </View>";

        camlQuery.FolderServerRelativeUrl = folder.ServerRelativeUrl;
        ListItemCollection listItems = list.GetItems(camlQuery);

        cxt.Load(listItems);
        cxt.ExecuteQuery();

        foreach (ListItem listItem in listItems)
        {
            if (listItem.FileSystemObjectType == FileSystemObjectType.File)
            {

                fullfilePaths.Add(String.Format("{0}{1}", server, listItem["FileRef"]));
            }
            else if (listItem.FileSystemObjectType == FileSystemObjectType.Folder)
            {
                Console.WriteLine(String.Format("{0}{1}", server, listItem["FileRef"]));
                fullfilePaths.Add(String.Format("{0}{1}", server, listItem["FileRef"]));
            }
        }
    }
    return fullfilePaths;
}

private static SharePointOnlineCredentials GetCreds(string username, string password)
{
    SecureString securePassword = new SecureString();

    foreach (char c in password.ToCharArray()) securePassword.AppendChar(c);
    return new SharePointOnlineCredentials(username, securePassword);
}

在阈值限制方面,我在一个只有 1 个文件和 1 个文件夹的文件夹上尝试过这个(反过来,该文件夹只有 1 个文件),所以如果限制是默认 5000,我不知道为什么我会得到这个。

【问题讨论】:

    标签: c# .net sharepoint caml sharepoint-clientobject


    【解决方案1】:

    终于找到了一个行得通的解决方案,即使有点大锤!

    虽然我要为其检索项目的文件夹远少于 5000 个项目,但问题是整个列表确实超过了此阈值(在本例中约为 11,000 个项目)。

    我删除了 FolderServerRelativeURL 属性,然后使用 ListItemCollectionPosition 对列表中的所有项目进行分页/批处理。一旦所有项目都在集合中,就可以使用 Linq 过滤相关子文件夹。 (CAML Query - Going around the 5000 List Item Threshold)

    如果有人有办法让这些物品更有针对性,我很乐意看到。

    代码:

    public static IEnumerable<ListItem> GetSharepointFiles2(string sharePointsite, string libraryName, string username, string password, string subFolders)
    {
        Uri filename = new Uri(sharePointsite);
        List<ListItem> items = new List<ListItem>();
    
        using (ClientContext cxt = new ClientContext(filename))
        {
            cxt.Credentials = GetCreds(username, password);
    
            Web web = cxt.Web;
            cxt.Load(web, wb => wb.ServerRelativeUrl);
            cxt.ExecuteQuery();
    
            List list = web.Lists.GetByTitle(libraryName);
            cxt.Load(list);
            cxt.ExecuteQuery();
    
            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = "<View Scope='Recursive'><RowLimit>5000</RowLimit></View>";
    
            do
            {
                ListItemCollection listItems = list.GetItems(camlQuery);
                cxt.Load(listItems);
                cxt.ExecuteQuery();
    
                items.AddRange(listItems);
                camlQuery.ListItemCollectionPosition = listItems.ListItemCollectionPosition;
    
            } while (camlQuery.ListItemCollectionPosition != null);
    
            var filteritems = items.Where(tt => tt.FieldValues["FileRef"].ToString().StartsWith(web.ServerRelativeUrl + subFolders));
    
            return filteritems;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 1970-01-01
      • 2012-05-06
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多