如何在C#中使用PnP Core、PnP Framework访问SharePoint文件夹和文件
不需要逐层遍历文件夹,可通过以下两种高性能方法直接定位目标文件夹:
方法1:使用原生CSOM API(Microsoft.SharePoint.Client)
先将目标文件夹的完整URL转换为服务器相对路径,示例中https://teamsite.msc.com/sites/mysite/Shared%20Documents/General/TestFolder/对应的服务器相对路径为/sites/mysite/Shared Documents/General/TestFolder/(将URL编码的%20替换为空格,删除域名前缀即可)。
// 填入目标文件夹的服务器相对路径 string targetFolderPath = "/sites/mysite/Shared Documents/General/TestFolder/"; // 直接定位文件夹 Folder targetFolder = clientContext.Web.GetFolderByServerRelativeUrl(targetFolderPath); // 按需加载文件夹属性、下属文件/子文件夹,仅需1次服务端请求 clientContext.Load(targetFolder, f => f.Exists, // 可先加载Exists属性判断文件夹是否存在 f => f.Name, f => f.Files, // 加载文件夹下所有文件 f => f.Folders); // 加载文件夹下所有子文件夹 clientContext.ExecuteQuery(); // 先判断文件夹是否存在再操作 if (targetFolder.Exists) { // 遍历文件示例 foreach (var file in targetFolder.Files) { Console.WriteLine($"文件名:{file.Name},文件路径:{file.ServerRelativeUrl}"); } }
方法2:使用PnP Core扩展方法(更简洁)
你已引入PnP.Core类库,可直接调用封装好的扩展方法,无需手动处理路径适配:
// 传入相对于站点根目录的文件夹路径即可,格式为「文档库名/子文件夹层级」 var targetFolder = clientContext.Web.GetFolderAsync("Shared Documents/General/TestFolder").GetAwaiter().GetResult(); // 直接获取文件夹下所有文件 var folderFiles = targetFolder.GetFilesAsync().GetAwaiter().GetResult(); foreach (var file in folderFiles) { Console.WriteLine(file.Name); }
性能对比说明
你当前使用的逐层遍历+循环调用ExecuteQuery()的方式,每进一级文件夹都会发起1次服务端请求,文件夹层级越深性能损耗越大。上述两种方法仅需要1-2次服务端请求即可拿到所有需要的数据,性能提升非常显著。
内容的提问来源于stack exchange,提问作者TemoZat
相关产品推荐
相关产品推荐

