在 Sharepoint 中使用 CSOM 动态创建文件夹会导致文档出现 ID 问题

Creating Folders dynamically using CSOM in sharepoint causes ID issues for the document

我正在为文档库动态创建嵌套文件夹并上传文件。下面的代码工作正常。但问题是每当我将文件上传到现有文件夹时,上传文档的文档 ID 不按顺序。假设如果我将文件上传到路径 projects\PRJ1\Assignment,第一次它分别创建 ID 为 (1) 的文件夹和文件。如果我将其他文档上传到同一文件夹,文件夹的 ID 没有改变,但文件的 ID 为 8。我在文档库中找不到 ID 5、6、7。

    using (CSOM.ClientContext clientContext = new CSOM.ClientContext(SPserverUrl))
                {
      clientContext.Credentials = new System.Net.NetworkCredential(Username, Password, Domain);
                    CSOM.Web _Site = clientContext.Web;
                   // string listrootfolder = "Testlist";
                    CSOM.List _List = _Site.Lists.GetByTitle("Testlist");
                    clientContext.Load(_List.RootFolder);
                    clientContext.ExecuteQuery();
                    string listrootfolder = _List.RootFolder.Name.ToString();
    var folder = CreateFolder(clientContext.Web, "Testlist", folderpath);

                        // uploading the document
                        CSOM.FileCreationInformation newFile = new CSOM.FileCreationInformation();
                        // newFile.Content = System.IO.File.ReadAllBytes(@"D:\Testupload.docx");  
                        byte[] bytes = Convert.FromBase64String(objReqDocumentDetials.FileData.ToString());
                        newFile.Content = bytes;
                        //   newFile.Url = objDocumentDetials.AttachmentName.ToString() + DateTime.Now.ToString("ddMMyyyyHHmmsss") + "." +          objDocumentDetials.FileType.ToString();
                        newFile.Url = objReqDocumentDetials.FileName.ToString() + "." + objReqDocumentDetials.FileType.ToString();
                        newFile.Overwrite = true;
                        Microsoft.SharePoint.Client.File _UploadingFile = folder.Files.Add(newFile);

                        var item = _UploadingFile.ListItemAllFields;
                        // var folder = item.GetFolder("account/" + folderName);
                      //  item["Year"] = DateTime.Now.Year.ToString();
                    //    item.Update();

                        clientContext.Load(_UploadingFile, f => f.ListItemAllFields);
                        clientContext.ExecuteQuery();
    }

    public CSOM.Folder CreateFolder(CSOM.Web web, string listTitle, string fullFolderPath)
    {
        if (string.IsNullOrEmpty(fullFolderPath))
            throw new ArgumentNullException("fullFolderPath");
        CSOM.List list = web.Lists.GetByTitle(listTitle);
        return CreateFolderInternal(web, list.RootFolder, fullFolderPath);
    }

    public CSOM.Folder CreateFolderInternal(CSOM.Web web, CSOM.Folder parentFolder, string fullFolderPath)
    {
        var folderUrls = fullFolderPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        string folderUrl = folderUrls[0];
        var curFolder = parentFolder.Folders.Add(folderUrl);
        web.Context.Load(curFolder);
        web.Context.ExecuteQuery();

        if (folderUrls.Length > 1)
        {
            var folderPath = string.Join("/", folderUrls, 1, folderUrls.Length - 1);
            return CreateFolderInternal(web, curFolder, folderPath);
        }
        return curFolder;
    }

问题已在如下重新定义 CreateFolder 和 CreateFolderInternal 方法后得到解决

    public CSOM.Folder CreateFolder(CSOM.Web web, string listTitle, string fullFolderPath)
    {

        var folderUrls = fullFolderPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

        CSOM.List _List = web.Lists.GetByTitle(listTitle);
        web.Context.Load(_List.RootFolder);
        web.Context.ExecuteQuery();
        string listrootfolder = _List.RootFolder.Name.ToString();
        web.Context.Load(web, w => w.ServerRelativeUrl);
        web.Context.ExecuteQuery();
        string root = "";
        for (int i = 0; i < folderUrls.Length; i++)
        {
            root = folderUrls[i].ToString();
            string targetFolderUrl = "/" + listrootfolder + "/" + string.Join("/", folderUrls, 0, i + 1);
            var folder1 = web.GetFolderByServerRelativeUrl(targetFolderUrl);
            web.Context.Load(folder1);
            bool exists = false;
            try
            {
                web.Context.ExecuteQuery();
                exists = true;
            }
            catch (Exception ex)
            {
            }
            if (!exists)
            {
                if (i == 0)
                {
                    CreateFolderInternal(web, _List.RootFolder, root);
                }
                else
                {
                    web.Context.Load(web, w => w.ServerRelativeUrl);
                    web.Context.ExecuteQuery();
                    var targetfolderUrls = targetFolderUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                    string jj = string.Join("/", targetfolderUrls, 0, targetfolderUrls.Length - 1);
                    CSOM.Folder folder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + jj);
                    web.Context.Load(folder);
                    web.Context.ExecuteQuery();
                    SPCreateFolderInternal(web, folder, root);
                }
            }
            else
            {
                //already folder exists
            }
        }
        CSOM.Folder finalfolder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + listrootfolder + "/" + fullFolderPath);
        web.Context.Load(finalfolder);
        web.Context.ExecuteQuery();
        return finalfolder;
    }
    private void CreateFolderInternal(CSOM.Web web, CSOM.Folder parentFolder, string fullFolderPath)
    {
        try
        {
            var curFolder = parentFolder.Folders.Add(fullFolderPath);
            web.Context.Load(curFolder);
            web.Context.ExecuteQuery();
        }
        catch (System.Exception ex)
        {               
        }
    }