Java通过Microsoft Graph API遍历SharePoint/OnDrive嵌套文件夹访问末端文件
不需要手动逐层拼接children接口调用,通过以下两种更简便的方式就能实现全层级文件的遍历访问,相比你当前用customRequest获取JsonObject再手动解析的写法,代码量更少、稳定性更高。
方案一:使用Delta端点一次性拉取全层级所有条目
该端点为Graph内置的递归遍历接口,会自动从指定根目录开始,遍历所有嵌套层级的文件夹和文件,无需手动写递归逻辑。
- Java SDK调用示例:
List<DriveItem> allNestedItems = new ArrayList<>(); // 从根目录开始拉取全量嵌套结构的条目 IDriveItemDeltaCollectionPage deltaPage = graphClient.drives(driveId).root() .delta() .buildRequest() .get(); // 循环处理接口分页,避免漏取数据 while (deltaPage != null) { allNestedItems.addAll(deltaPage.getCurrentPage()); if (deltaPage.getNextPage() != null) { deltaPage = deltaPage.getNextPage().buildRequest().get(); } else { deltaPage = null; } }
- 接口优势:
- 返回的每个条目自动携带父项ID、完整存储路径,不需要手动维护层级关系
- 兼容任意深度的文件夹嵌套结构,哪怕嵌套10层以上也不需要调整代码
- 后续做增量同步时,只需留存上次返回的deltaToken,即可只拉取变更的文件/文件夹,大幅降低请求量
- 遍历到文件类条目(
file属性非空、无folder属性)时,可直接用返回的itemId调用/content接口拉取文件内容,不需要拼接完整路径
方案二:通用递归遍历写法(适配自定义遍历逻辑场景)
如果需要在遍历过程中加自定义的筛选、过滤规则,可以封装通用递归方法替代硬编码多层children调用:
// 存储遍历到的所有文件条目 List<DriveItem> allFiles = new ArrayList<>(); /** * 递归遍历指定文件夹下的所有层级内容 * @param folderItemId 待遍历文件夹的ItemId */ private void traverseAllLevelFolders(String folderItemId) { // 拉取当前文件夹下的直接子项 List<DriveItem> currentChildren = graphClient.drives(driveId) .items(folderItemId) .children() .buildRequest() .get() .getCurrentPage(); for (DriveItem child : currentChildren) { // 遇到文件夹则递归进入下一层遍历 if (child.folder != null) { traverseAllLevelFolders(child.id); } else if (child.file != null) { // 遇到文件则存入结果列表,后续可直接拉取内容 allFiles.add(child); } } } // 从根目录启动遍历 String rootItemId = graphClient.drives(driveId).root().buildRequest().get().id; traverseAllLevelFolders(rootItemId);
通用注意事项
- 遍历过程中必须做分页处理,Graph接口默认单页最多返回100条数据,遇到子项较多的文件夹时,需要循环读取
nextPage避免漏取数据 - 访问文件内容时优先使用itemId拼接请求,不要手动拼接完整文件路径,深嵌套场景下路径长度容易触发接口长度限制
- 不需要为不同层级的文件夹写单独的children调用逻辑,统一通过itemId拉取子项的写法可以兼容任意嵌套深度
内容的提问来源于stack exchange,提问作者varsha
相关产品推荐
相关产品推荐

