簡體   English   中英

在 C# 中,如果 SharePoint 網站上不存在文件夾,如何創建該文件夾

[英]In C#, how can I create a folder if it does not exist on a SharePoint site

我正在嘗試在 C# 中創建一個微服務,它將接受一個包含訂單號的 csv 文件,消化 csv,連接到 sharepoint,在 sharepoint 上創建一個新文件夾,然后從任何地方復制名稱與訂單號相對應的合同(它們可能不會都在 smae 位置)到新文件夾。

此時,在 Stackoverflow 的幫助下,我可以使用CSOM 身份驗證管理器從我們的 Sharepoint 成功獲取身份驗證令牌。 現在我想弄清楚如何創建文件夾。 谷歌搜索有關創建 Sharepoint 文件夾的信息不斷提出列表主題,我對此一無所知,甚至不知道我是否真的想要或需要了解任何信息,或者是否可能有不同的工作方式與該網站,因為那是我真正感興趣的。

因此,假設我在https://example.sharepoint.com/sites/MySite 上有一個 sharepoint 站點。

如何在“共享文檔”中存在的名為“Bar”的文件夾中簡單地創建一個名為“Foo”的文件夾?

如果我需要了解一些關於列表的信息才能做到這一點,我可以使用 C# 來找到正確的列表嗎? 或者我需要找我的管理員獲取更多信息嗎?

假設 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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM