You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python os.walk()遍历OneDrive目录时因文件数量异常忽略文件

OneDrive同步SharePoint目录时os.walk/glob遍历文件异常(WinError 87)的解决思路

问题概述

  • 遍历OneDrive同步的SharePoint快捷方式目录时,当某目录文件数量达到897个,os.walk()会完全忽略该目录下的所有文件;删除任意2个文件后,遍历恢复正常
  • 改用glob.glob()方案仅能获取该目录下约一半的文件,同样删除2个文件后可获取完整列表
  • 将文件复制到本地非OneDrive同步目录后,遍历完全正常,确认问题与OneDrive同步机制相关
  • 已排查微软官方《OneDrive和SharePoint的限制》文档,当前文件数量/大小远未达到官方标注的限制;尝试重新同步目录、重启OneDrive/电脑、完全重置OneDrive均无法解决问题
  • 进一步验证发现:当文件数量触发阈值时,os.listdir()、win32file.FindFilesW()等底层文件操作函数会抛出OSError: [WinError 87] 参数不正确错误,且同一组织内另一台机器可复现该问题

可行解决方向

1. 拆分目录文件数量

既然实际测试发现阈值在895个文件左右(897-2),可手动将该目录拆分为多个子目录,每个子目录的文件数控制在890以内,直接绕过OneDrive同步目录的隐性遍历限制。

2. 使用OneDrive/SharePoint官方API替代本地遍历

放弃依赖本地同步后的文件系统,直接调用官方API读取目录内容:

# 示例:使用Microsoft Graph API获取SharePoint目录文件(需提前获取访问令牌)
import requests

access_token = "你的有效访问令牌"
site_id = "目标SharePoint站点ID"
drive_id = "目标文档库ID"
folder_path = "/你的问题目录路径"

api_url = f"https://graph.microsoft.com/v1.0/sites/{site_id}/drives/{drive_id}/root:{folder_path}:/children"
headers = {"Authorization": f"Bearer {access_token}"}

response = requests.get(api_url, headers=headers)
if response.status_code == 200:
    file_list = [item["name"] for item in response.json()["value"]]
    print(f"获取到文件:{file_list}")

3. 调整OneDrive同步设置排查

  • 关闭OneDrive的“按需文件”功能,等待目录完全同步到本地后,再次测试遍历逻辑(尽管用户已手动下载全部文件,但同步缓存可能存在异常)
  • 查看OneDrive同步日志(设置>关于>查看日志),排查是否有针对该目录的同步错误记录

4. 尝试第三方/替代遍历方法

使用pathlib库的迭代方法尝试遍历,看是否能规避底层API的限制:

from pathlib import Path

target_root = Path("你的主目录路径")
files = []
for item in target_root.rglob("*"):
    if item.is_file() and "Common part" in str(item.parent):
        files.append(str(item))
print(files)

总结

该问题属于OneDrive同步SharePoint目录时的隐性未公开限制,导致系统底层文件操作API调用失败。优先推荐拆分目录的快速解决方式,长期方案建议使用官方API进行文件操作,避免依赖本地同步的文件系统。

内容的提问来源于stack exchange,提问作者wind5piel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:37:13