如何使用MS Graph API在指定归档路径下创建子文件夹(C#)
在Online Archive指定父文件夹下创建子文件夹(C# + MS Graph API)
核心逻辑
要在Online Archive/Inbox/TestParentFolder/路径下创建子文件夹,关键是先定位到TestParentFolder的ID,再向该文件夹的childFolders端点发送创建请求——Online Archive的层级操作和普通邮件文件夹完全一致,只是起始定位点是系统预设的archive文件夹。
实现步骤
- 逐层定位父文件夹
- Online Archive对应MS Graph中用户的预设文件夹
archive,可直接用"archive"作为ID访问; - 从
archive下找到Inbox子文件夹,再从Inbox下找到TestParentFolder;
- Online Archive对应MS Graph中用户的预设文件夹
- 创建子文件夹
拿到父文件夹ID后,调用ChildFolders.PostAsync()方法,逻辑和你在根目录创建文件夹一致,只是请求路径指向父文件夹的子文件夹集合。
完整代码示例
using Microsoft.Graph.Models; using System.Linq; public async Task<Models.Folder> CreateArchiveSubFolderAsync(string mailbox, string parentFolderPath, string folderName) { // 拆分路径并移除空项 var pathSegments = parentFolderPath.Split('/', StringSplitOptions.RemoveEmptyEntries); // 起始节点:Online Archive对应的系统预设文件夹"archive" var currentFolderClient = _graphServiceClient.Users[mailbox].MailFolders["archive"]; // 遍历路径层级,逐层定位目标父文件夹 foreach (var folderNameSegment in pathSegments.Skip(1)) // 跳过第一个"Online Archive",已定位到archive文件夹 { var childFolders = await currentFolderClient.ChildFolders.GetAsync(); var targetFolder = childFolders.FirstOrDefault(f => f.DisplayName.Equals(folderNameSegment, StringComparison.OrdinalIgnoreCase)); if (targetFolder == null) { throw new InvalidOperationException($"路径中未找到文件夹:{folderNameSegment}"); } currentFolderClient = _graphServiceClient.Users[mailbox].MailFolders[targetFolder.Id]; } // 构造新文件夹请求体 var newFolderBody = new MailFolder { DisplayName = folderName, IsHidden = false }; // 在目标父文件夹下创建子文件夹 var createdFolder = await currentFolderClient.ChildFolders.PostAsync(newFolderBody); return new Models.Folder { Id = createdFolder.Id }; }
调用示例
// 在Online Archive/Inbox/TestParentFolder下创建名为"NewSubFolder"的子文件夹 var resultFolder = await CreateArchiveSubFolderAsync( mailbox: "user@domain.com", parentFolderPath: "Online Archive/Inbox/TestParentFolder/", folderName: "NewSubFolder" );
注意事项
- 确保你的Graph应用已配置
Mail.ReadWrite权限(应用权限或委派权限均可,根据场景选择); - 若路径固定且频繁使用,建议缓存父文件夹ID,避免每次逐层查询,提升性能;
- 路径匹配默认忽略大小写,如需严格匹配可移除
StringComparison.OrdinalIgnoreCase参数。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

