Box.com API获取文件夹全量文件时仅返回1000条的问题问询
问题原因
Box 文件夹条目接口的单页返回有硬上限:无论你传入的limit参数设置为多大,单页最多只会返回1000条条目。你传入10000的limit最终会被接口截断为1000,因此仅靠单次调用无法拿到超过1000条的内容。
另外你原代码存在变量名笔误:声明的任务对象为objFileItems,但后续调用的是objFolderItems.Wait(),会直接触发空引用异常,需先修正。
两种调整方案
方案1:手动循环分页拉取(兼容所有SDK版本)
逻辑要点:
- 用BoxCollection返回的
TotalCount字段确认文件夹总条目数 - 从
offset=0开始,每次拉取1000条(即单页最大允许值),将每页的条目追加到总列表 - 当累计拉取的条目数等于总条目数时终止循环
修正后的代码示例:
// 原有获取文件夹基础信息逻辑保留 Task<BoxFolder> boxFolder1 = objClient.FoldersManager.GetInformationAsync(id: objItem.Id); boxFolder1.Wait(); WriteLog("Processing Folder => " + boxFolder1.Result.Name); // 初始化全量条目收集列表 List<BoxItem> allFolderItems = new List<BoxItem>(); int offset = 0; int pageSize = 1000; // Box单页最大允许值,传更高不会生效 // 循环拉取所有分页 while (true) { // 修正原代码的变量名笔误,传入正确的limit和offset Task<BoxCollection<BoxItem>> currentPageTask = objClient.FoldersManager.GetFolderItemsAsync( folderId: objItem.Id, limit: pageSize, offset: offset ); currentPageTask.Wait(); BoxCollection<BoxItem> currentPage = currentPageTask.Result; // 把当前页条目加入总列表 allFolderItems.AddRange(currentPage.Entries); // 终止条件:累计拿到的条目数已经等于总条目数,或当前页无内容 if (allFolderItems.Count >= currentPage.TotalCount || currentPage.Entries.Count == 0) { break; } // 偏移量累加,拉取下一页 offset += pageSize; } // 后续原有处理逻辑:筛选PDF文件 if (allFolderItems.Count > 0) { List<BoxItem> objFiles = allFolderItems.Where(i => i.Type == "file").ToList(); if (objFiles.Count > 0) { foreach (BoxItem objFile in objFiles) { if (Path.GetExtension(objFile.Name).ToLower() == ".pdf") { // Insert metadata into DB 原有逻辑保留 } } } }
方案2:使用SDK内置自动分页参数(适配较新版本Box .NET SDK)
如果你的SDK版本支持GetFolderItemsAsync的autoPaginate参数,无需手动写循环,直接传该参数为true即可让SDK自动完成所有分页的拉取,代码会更简洁:
// 原有获取文件夹基础信息逻辑保留 Task<BoxFolder> boxFolder1 = objClient.FoldersManager.GetInformationAsync(id: objItem.Id); boxFolder1.Wait(); WriteLog("Processing Folder => " + boxFolder1.Result.Name); // 直接启用自动分页,SDK会自动拉取所有页数据 Task<BoxCollection<BoxItem>> objFileItems = objClient.FoldersManager.GetFolderItemsAsync( folderId: objItem.Id, limit: 1000, offset: 0, autoPaginate: true ); objFileItems.Wait(); // 后续原有处理逻辑保持不变 if (objFileItems.Result.Entries.Count > 0) { List<BoxItem> objFiles = objFileItems.Result.Entries.Where(i => i.Type == "file").ToList(); if (objFiles.Count > 0) { foreach (BoxItem objFile in objFiles) { if (Path.GetExtension(objFile.Name).ToLower() == ".pdf") { // Insert metadata into DB 原有逻辑保留 } } } }
注意事项
- 不要把
limit设置为超过1000的值,接口不会生效,反而可能触发参数校验异常 - 循环分页时要增加异常重试逻辑,避免网络波动导致单页拉取失败中断全量流程
- 原代码中
objFolderItems.Wait()的笔误必须修正,否则代码无法正常运行
内容的提问来源于stack exchange,提问作者FirstAider
相关产品推荐
相关产品推荐

