Windows Server 2012 R2下os.walk()找到文件却无法访问的问题
问题:Windows共享文件夹中
os.walk()可列出文件,但约0.2%文件访问时提示不存在 现象与背景
在Windows Server 2012 R2的共享文件夹上运行Python代码时,os.walk()能完整获取文件列表,但对其中约0.2%的文件执行os.stat()、open()等操作时,会触发FileNotFoundError。本地Windows 11设备运行相同代码访问本地文件完全正常,该问题仅出现在访问服务器共享文件夹场景,业务需求为自动化迁移该共享文件夹至Google Drive共享驱动器。
已完成排查
- 排除代码问题:多次简化测试代码(如仅保留
os.walk()遍历+os.stat()获取大小的逻辑),问题仍复现;测试代码统计显示193878个文件中有384个无法访问,占比0.198%。 - 排除长路径限制:已成功访问路径长度超过300字符的文件,问题文件无统一路径长度特征。
- 无文件类型关联:无法访问的文件涵盖多种类型,并非单一格式。
- 确认系统侧问题:在PowerShell中可通过目录列表看到目标文件,但单独访问该文件时提示路径不存在,说明问题与Python无关,源于Windows系统或共享机制异常。
可行的排查与解决方向
核对文件权限(共享+NTFS)
- 检查无法访问的文件的NTFS权限:右键文件→属性→安全,确认当前访问账号拥有“读取”“读取和执行”权限。注意共享权限与NTFS权限取交集生效,即使共享权限全开,NTFS权限不足也会导致访问失败。
- 若文件继承权限异常,可尝试重新应用父目录权限,或手动添加账号权限。
检查文件系统完整性
- 在服务器上对共享文件夹所在分区执行
chkdsk /f命令(需先停止共享或进入安全模式,避免文件占用),修复潜在的文件系统损坏。 - 使用
fsutil file queryallinfo "<文件路径>"命令查看文件元数据,确认系统层面是否能正常识别该文件。
- 在服务器上对共享文件夹所在分区执行
处理文件名特殊字符
- 部分文件可能包含远程访问时解析异常的字符(如全角空格、不可见控制字符)。在服务器本地重命名这类文件,再重新测试访问。
- 用PowerShell的
Get-ChildItem -LiteralPath "<目录路径>"命令查看文件原始名称,避免自动转义特殊字符,排查是否存在命名异常。
调整SMB协议配置
- 强制使用SMB 3.0协议访问共享:将文件路径改为
\\?\UNC\<服务器名>\<共享名>\<文件路径>的长路径格式,同时确保客户端启用SMB 3.0。 - 重启服务器的
Server服务:执行net stop server && net start server,修复SMB服务的临时异常。
- 强制使用SMB 3.0协议访问共享:将文件路径改为
排查文件锁定情况
- 使用
Process Explorer工具查找是否有服务器上的进程锁定了无法访问的文件,释放锁定后重试。 - 若文件是临时生成的,可能未完全写入磁盘,等待一段时间后再尝试访问。
- 使用
内容的提问来源于stack exchange,提问作者sanigirl
相关产品推荐
相关产品推荐

