【问题标题】:In C#, how can I create a folder if it does not exist on a SharePoint site在 C# 中,如果 SharePoint 网站上不存在文件夹,如何创建该文件夹
【发布时间】:2020-11-20 10:37:24
【问题描述】:

我正在尝试在 C# 中创建一个微服务,它将接受一个包含订单号的 csv 文件,消化 csv,连接到 sharepoint,在 sharepoint 上创建一个新文件夹,然后从任何位置复制名称与订单号对应的合同它们可能(并且它们可能不会都在 smae 位置)到新文件夹。

此时,在 Stackoverflow 的帮助下,我可以使用 CSOM Authentication Manager 从我们的 Sharepoint 成功获取身份验证令牌。现在我想弄清楚如何创建一个文件夹。谷歌搜索有关创建 Sharepoint 文件夹的信息不断提出列表的主题,我对此一无所知,甚至不知道我是否真的想要或需要知道任何事情,或者是否有不同的工作方式与网站,因为那是我真正感兴趣的。

所以,假设我有一个位于 https://example.sharepoint.com/sites/MySite 的共享点站点。

如何在“共享文档”中存在的名为“Bar”的文件夹中简单地创建一个名为“Foo”的文件夹?

如果我需要了解一些有关列表的信息才能执行此操作,我可以使用 C# 来查找正确的列表吗?还是我需要向我的管理员询问更多信息?

【问题讨论】:

  • 用不了解其基本和最常用数据结构的语言进行编程将很难...如果您不了解列表,为什么不学习该主题第一?
  • SharePoint 是一个带有 API 的文档管理应用程序。它既不是数据库也不是文件系统。如果你不了解基础知识,你就无法为它编程
  • 我知道 C# 中的列表。我不知道 Sharepoint 上的列表。我真的需要了解它们吗?
  • 他们完全没有共同点。这就像询问 Google 表格是否与 string[,] 数组相同。 Google 表单可能更接近 SharePoint 列表 - 表单将答案存储在(Google 的)列表中
  • 但这就是重点。我想知道是否有用于 Sharepoint 的 API 可以让我简单地使用共享文件夹或文件,或者我是否需要花时间学习更多关于 Sharepoint 的知识,而不是我需要知道的手头问题?

标签: c# sharepoint csom shared-directory create-directory


【解决方案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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2018-02-10
    • 1970-01-01
    • 2014-11-24
    • 2011-01-19
    相关资源
    最近更新 更多