如何使用CAML查询从含特殊字符(%)的SharePoint文件夹中检索文件
核心问题处理:特殊字符转义
你的文件夹名称包含%,这在CAML中属于转义字符,必须将%替换为%25才能正确匹配。原文件夹名(ABC%ABC)需要转写为(ABC%25ABC)。
完整CAML查询示例
假设目标文件夹的服务器相对路径为/sites/YourSite/Shared Documents/(ABC%25ABC),以下CAML会筛选出该文件夹下的所有文件(排除子文件夹):
<View> <Query> <Where> <And> <!-- 筛选文件:FSObjType=0 代表文件,=1 代表文件夹 --> <Eq> <FieldRef Name="FSObjType" /> <Value Type="Integer">0</Value> </Eq> <!-- 匹配文件所在的文件夹路径 --> <Eq> <FieldRef Name="FileDirRef" /> <Value Type="Text">/sites/YourSite/Shared Documents/(ABC%25ABC)</Value> </Eq> </And> </Where> </Query> <!-- 可选:指定要返回的字段 --> <ViewFields> <FieldRef Name="FileLeafRef" /> <FieldRef Name="Created" /> <FieldRef Name="Modified" /> </ViewFields> </View>
代码实现示例(SSOM)
为避免手动转义出错,建议通过SharePoint对象模型先获取文件夹的服务器相对路径,再代入查询:
using (SPSite site = new SPSite("http://your-sharepoint-site-url")) { using (SPWeb web = site.OpenWeb()) { // 获取目标文件夹(直接用原名称,SP对象会自动处理转义) SPFolder targetFolder = web.GetFolder("/sites/YourSite/Shared Documents/(ABC%ABC)"); if (!targetFolder.Exists) { Console.WriteLine("目标文件夹不存在"); return; } SPList docLib = web.Lists.TryGetList("Shared Documents"); if (docLib == null) { Console.WriteLine("文档库不存在"); return; } // 构建CAML查询 SPQuery query = new SPQuery(); query.Query = $@" <View> <Query> <Where> <And> <Eq> <FieldRef Name='FSObjType' /> <Value Type='Integer'>0</Value> </Eq> <Eq> <FieldRef Name='FileDirRef' /> <Value Type='Text'>{targetFolder.ServerRelativeUrl}</Value> </Eq> </And> </Where> </Query> </View>"; SPListItemCollection files = docLib.GetItems(query); foreach (SPListItem file in files) { Console.WriteLine($"文件:{file["FileLeafRef"]} | 最后修改:{file["Modified"]}"); } } }
注意事项
- 确保执行查询的账号拥有目标文件夹和文档库的读取权限
- 如果使用CSOM,逻辑完全一致:先获取
Folder对象的ServerRelativeUrl,再构建相同结构的CAML查询 - 不要省略
FSObjType=0的条件,否则查询结果会包含文件夹本身
内容的提问来源于stack exchange,提问作者Rojin
相关产品推荐
相关产品推荐

