Как в C # создать папку, если ее нет на сайте SharePoint

Я пытаюсь создать микросервис на C #, который будет принимать CSV-файл, содержащий порядковые номера, обрабатывать CSV-файл, подключаться к sharepoint, создавать новую папку в sharepoint, а затем копировать контракты с именами, соответствующими порядковому номеру, откуда бы они ни были (и они, вероятно, не все будут на месте) в новую папку.

На этом этапе с помощью Stackoverflow я могу успешно получить токен аутентификации из нашего Sharepoint, используя CSOM Authentication Manager. И теперь я пытаюсь понять, как создать папку. Поиск в Google информации о создании папок Sharepoint продолжает поднимать тему списков, о которых я ничего не знаю и даже не знаю, действительно ли я хочу или должен что-то знать, или может быть другой способ, который работает с сайтом, поскольку это то, что меня действительно интересует.

Итак, допустим, у меня есть сайт sharepoint по адресу https://example.sharepoint.com/sites/MySite < / а>.

Как я могу просто создать папку с именем Foo в папке с именем Bar, которая существует в общих документах?

Если мне нужно что-то знать о списках для этого, могу ли я использовать C # для поиска правильного списка? Или мне нужно преследовать моего администратора за дополнительной информацией?


person Brian Kessler    schedule 20.11.2020    source источник
comment
Будет сложно программировать на языке, для которого не известны его основные и наиболее часто используемые структуры данных ... Если вы не знаете о списках, почему вы не можете сначала изучить эту тему?   -  person kosist    schedule 20.11.2020
comment
SharePoint - это приложение для управления документами с API. Это ни база данных, ни файловая система. Вы не можете программировать для этого, если не понимаете основ   -  person Panagiotis Kanavos    schedule 20.11.2020
comment
Я знаю о списках на C #. Я не знаю о списках на Sharepoint. Мне действительно нужно о них знать?   -  person Brian Kessler    schedule 20.11.2020
comment
У них нет абсолютно ничего общего. Это все равно, что спросить, совпадают ли таблицы Google с массивом string[,]. Google Forms, вероятно, ближе к спискам SharePoint - Forms хранит ответы в списках (Google)   -  person Panagiotis Kanavos    schedule 20.11.2020
comment
Но в том-то и дело. Я хочу знать, есть ли API для Sharepoint, который позволит мне просто работать с общими папками или файлами, или мне нужно потратить время на изучение Sharepoint больше, чем мне нужно для решения моей проблемы?   -  person Brian Kessler    schedule 20.11.2020
comment
sharepoint.stackexchange.com/questions/190594/   -  person Robert Harvey    schedule 23.11.2020


Ответы (1)


Предполагая, что AuthenticationManager возвращает допустимый контекст и корневая папка уже существует, работает следующее:

using Microsoft.SharePoint.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using AuthenticationManager = SharepointOrderContractExtractor.Clients.AuthenticationManager;

namespace SharePointOrderContractExtractor.Clients
{
    public class FolderManager
    {
        private readonly AuthenticationManager _authenticationManager;

        public FolderManager(
            AuthenticationManager sharepointAuthenticationManager
            )
        {
            _authenticationManager = sharepointAuthenticationManager;
        }

        internal Folder EnsureAndGetTargetFolder(string folderPath)
        {
            using ClientContext context = _authenticationManager.GetContext();

            List<string> folderNames = folderPath.Split("/").ToList();
            List documents = context.Web.Lists.GetByTitle(folderNames[0]);
            folderNames.RemoveAt(0);

            return EnsureAndGetTargetFolder(context, documents, folderNames);
        }

        private Folder EnsureAndGetTargetFolder(ClientContext context, List list, List<string> folderPath)
        {
            Folder returnFolder = list.RootFolder;
            return (folderPath != null && folderPath.Count > 0)
                ? EnsureAndGetTargetSubfolder(context, list, folderPath)
                : returnFolder;
        }

        private Folder EnsureAndGetTargetSubfolder(ClientContext context, List list, List<string> folderPath)
        {
            Web web = context.Web;
            Folder currentFolder = list.RootFolder;
            context.Load(web, t => t.Url);
            context.Load(currentFolder);
            context.ExecuteQuery();

            foreach (string folderPointer in folderPath)
            {
                currentFolder = FindOrCreateFolder(context, list, currentFolder, folderPointer);
            }

            return currentFolder;
        }

        private Folder FindOrCreateFolder(ClientContext context, List list, Folder currentFolder, string folderPointer)
        {
            FolderCollection folders = currentFolder.Folders;
            context.Load(folders);
            context.ExecuteQuery();

            foreach (Folder existingFolder in folders)
            {
                if (existingFolder.Name.Equals(folderPointer, StringComparison.InvariantCultureIgnoreCase))
                {
                    return existingFolder;
                }
            }

            return CreateFolder(context, list, currentFolder, folderPointer);
        }

        private Folder CreateFolder(ClientContext context, List list, Folder currentFolder, string folderPointer)
        {
            ListItemCreationInformation itemCreationInfo = new ListItemCreationInformation
            {
                UnderlyingObjectType = FileSystemObjectType.Folder,
                LeafName = folderPointer,
                FolderUrl = currentFolder.ServerRelativeUrl
            };

            ListItem folderItemCreated = list.AddItem(itemCreationInfo);
            folderItemCreated.Update();

            context.Load(folderItemCreated, f => f.Folder);
            context.ExecuteQuery();

            return folderItemCreated.Folder;
        }
    }
}
person Brian Kessler    schedule 23.11.2020