C # Sharepoint.Client - вернуть все файлы и папки из данной подпапки - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь вернуть все файлы и папки в библиотеке SharePoint, начиная с указанной подпапки.

Если я установлю FolderServerRelativeUrl на CamlQuery в папку, из которой я хочу начать, я могу получить всесписок элементов для данной папки;однако, когда я пытаюсь добавить в 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, я понятия не имею, почему я получу это.

1 Ответ

0 голосов
/ 19 октября 2018

Наконец-то нашли решение, которое работает, даже если это немного кувалдой!

Хотя в папках, которые я искал для поиска предметов, было намного меньше 5000 элементов, проблема заключалась в списке в целомдействительно превысило этот порог (в данном случае это было около 11 000 элементов).

Я удалил атрибут FolderServerRelativeURL и затем использовал ListItemCollectionPosition для разбивки на страницы / пакетирования всех элементов в списке.Как только все элементы находятся в коллекции, ее можно отфильтровать с помощью Linq для соответствующей подпапки.( CAML Query - Обход порогового значения элемента списка 5000 )

Если у кого-то есть способ быть более целенаправленным с предметами, я бы хотел увидеть его.

Код:

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;
    }
}
...