c# - 如果 SharePoint 文件夹不存在,则创建该文件夹

标签 c# sharepoint-2013

我需要在 SharePoint 文档库中创建一个文件夹,如果它不存在,然后将文件上传到它。
这是我正在使用的代码:

public static bool FolderExists(Web web, string listTitle, string folderUrl)
{
    var list = web.Lists.GetByTitle(listTitle);
    var folders = list.GetItems(CamlQuery.CreateAllFoldersQuery());
    web.Context.Load(list.RootFolder);
    web.Context.Load(folders);
    web.Context.ExecuteQuery();
    var folderRelativeUrl = string.Format("/{0}/{1}", list.RootFolder.ServerRelativeUrl, folderUrl);
    return Enumerable.Any(folders, folderItem => (string)folderItem["FileRef"] == folderRelativeUrl);
}

private static void CreateFolder(Web web, string listTitle, string folderName)
{
    var list = web.Lists.GetByTitle(listTitle);
    var folderCreateInfo = new ListItemCreationInformation
    {
        UnderlyingObjectType = FileSystemObjectType.Folder,
        LeafName = folderName
    };
    var folderItem = list.AddItem(folderCreateInfo);
    folderItem.Update();
    web.Context.ExecuteQuery();
}

public void UploadFile(string CourseId, string path)
{
    string libraryName = "Documents";
    using (ClientContext clientContext = GetContextObject())
    {
        // if a folder doesn't exists, create it
        if (!FolderExists(clientContext.Web, libraryName, CourseId))
        {
            CreateFolder(clientContext.Web, libraryName, CourseId);

        }

        // if exists, upload input file in Documents/FolderName given by CourseId
        Web web = clientContext.Web;
        List list3 = clientContext.Web.Lists.GetByTitle("Documents");
        clientContext.Load(list3.RootFolder);
        clientContext.ExecuteQuery();
        using (FileStream fileStream = new FileStream(path, FileMode.Open))
        {
            string ext = Path.GetExtension(fileStream.Name);
            Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, list3.RootFolder.ServerRelativeUrl.ToString() + "/" + CourseId + "/" + path.Split('\\').Last(), fileStream, true);
        }

    }

}

问题如下:这些功能运行良好,但如果文件夹已经存在,尝试再次创建它会导致异常,而是只会上传“CourseId”文件夹中的文件而跳过其创建。我该如何解决?

最佳答案

尝试以下代码可以帮助您检查 sharepoint 文件夹是否存在

 using Microsoft.SharePoint.Client;

 namespace SharePoint.Client.Extensions
 {
 public static class WebExtensions
 {
    public static bool TryGetFileByServerRelativeUrl(this Web web, string serverRelativeUrl, out File file)
    {
        var ctx = web.Context;
        try
        {
            file = web.GetFileByServerRelativeUrl(serverRelativeUrl);
            ctx.Load(file);
            ctx.ExecuteQuery();
            return true;
        }
        catch (ServerException ex)
        {
            if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException")
            {
                file = null;
                return false;
            }
            throw;
        }
     }
  }
}

关于c# - 如果 SharePoint 文件夹不存在,则创建该文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48906267/

相关文章:

c# - 如何绕过 "Internal .NET Framework Data Provider error 1025."?

c# - 扩展方法解析 IQueryable 与 IEnumerable

javascript - 使用 SPServices UpdateListItems 在 SharePoint 2013 中设置日期

SharePoint 2013人员选择器检索用户的旧信息

c# - Control.MouseWheel 事件

c# - 内存映射文件被加载到进程的用户模式地址空间或内核地址空间?

c# - new Rectangle() c# 的浮点参数而不是 int 参数?

web-services - SharePoint 2013 中的自定义 Web 服务与模拟

customization - 使用 FBA 身份验证的 SharePoint 2013 中的自定义登录页面

rest - 删除所有列表项 Sharepoint 2013 REST