如何用C#在SharePoint Online的子文件夹中创建子子文件夹?
我瞅了你的代码,发现几个导致子文件夹创建失败的关键问题:
- 创建完"Muster Mandant"后,没有重新加载父文件夹的子文件夹集合,导致后续遍历的还是旧数据,找不到刚创建的文件夹
- 第二个foreach里调用
Add方法后,没有执行context.ExecuteQuery()来提交创建操作 - 逻辑上的嵌套遍历容易出错,而且不够灵活
针对你的需求修正后的代码
下面是修复后的版本,能确保在"Muster Mandant"下成功创建子文件夹:
public static void AddFolder(ClientContext context, string[] folders) { Web web = context.Web; var docLibrary = web.DefaultDocumentLibrary().RootFolder; context.Load(docLibrary); context.ExecuteQuery(); // 定位到"98_Projekte"文件夹 Folder projektFolder = null; foreach (Folder subFolder in docLibrary.Folders) { if (subFolder.Name == "98_Projekte") { projektFolder = subFolder; break; } } if (projektFolder == null) { throw new Exception("未找到顶层文件夹:98_Projekte"); } // 检查并创建"Muster Mandant"文件夹 Folder mandantFolder = null; // 先加载该文件夹的子集合,确保拿到最新数据 context.Load(projektFolder.Folders); context.ExecuteQuery(); foreach (Folder subFolder in projektFolder.Folders) { if (subFolder.Name == "Muster Mandant") { mandantFolder = subFolder; break; } } if (mandantFolder == null) { mandantFolder = projektFolder.Folders.Add("Muster Mandant"); context.ExecuteQuery(); } // 在"Muster Mandant"下批量创建子文件夹 foreach (string folderName in folders) { // 先检查是否已存在,避免重复创建报错 bool folderExists = mandantFolder.Folders.Any(f => f.Name.Equals(folderName, StringComparison.OrdinalIgnoreCase)); if (!folderExists) { mandantFolder.Folders.Add(folderName); } } // 统一提交所有子文件夹的创建操作 context.ExecuteQuery(); }
更通用的递归层级创建方法
如果以后需要创建任意深度的文件夹结构,推荐用递归方法,灵活性更强:
// 递归创建层级文件夹的通用方法 public static Folder CreateFolderHierarchy(ClientContext context, Folder parentFolder, string[] folderHierarchy) { if (folderHierarchy == null || folderHierarchy.Length == 0) return parentFolder; string currentFolderName = folderHierarchy[0]; Folder currentFolder = null; // 加载父文件夹的子文件夹集合 context.Load(parentFolder.Folders); context.ExecuteQuery(); // 检查当前层级文件夹是否已存在 foreach (Folder subFolder in parentFolder.Folders) { if (subFolder.Name.Equals(currentFolderName, StringComparison.OrdinalIgnoreCase)) { currentFolder = subFolder; break; } } // 不存在则创建 if (currentFolder == null) { currentFolder = parentFolder.Folders.Add(currentFolderName); context.ExecuteQuery(); } // 递归处理剩余层级 return CreateFolderHierarchy(context, currentFolder, folderHierarchy.Skip(1).ToArray()); } // 调用示例:创建你的目标层级 public static void CreateTargetFolderStructure(ClientContext context) { var docLibrary = context.Web.DefaultDocumentLibrary().RootFolder; context.Load(docLibrary); context.ExecuteQuery(); // 定义完整的层级路径数组 string[] targetHierarchy = new[] { "98_Projekte", "Muster Mandant", "01 Test Subfolder" }; CreateFolderHierarchy(context, docLibrary, targetHierarchy); }
这个方法的好处是:
- 支持任意深度的文件夹层级,不用硬编码每一层逻辑
- 自动检查每个层级的文件夹是否存在,避免重复创建抛出异常
- 代码复用性高,后续创建其他结构只需修改层级数组即可
内容的提问来源于stack exchange,提问作者Nick Delefski
相关产品推荐
相关产品推荐

