VBA Dir及FileSystemObject统计OneDrive for Business文件夹文件数异常排查
针对OneDrive for Business本地同步文件夹(路径%UserProfile%\SPO_Domain\Site\Library)中某文件夹出现的文件计数异常问题,以下是具体的可能原因:
OneDrive同步未完成或文件锁定:该文件夹内部分文件可能处于OneDrive同步中、未完成同步状态,或是被OneDrive的同步进程临时锁定。FSO(
CreateObject("Scripting.FileSystemObject"))和VBADir函数访问OneDrive同步目录时,会受限于OneDrive的文件系统管控,无法读取这类处于特殊状态的文件,导致计数和遍历提前终止。当文件夹复制到本地目录后,脱离了OneDrive的同步环境,所有文件都处于可正常访问的本地状态,因此统计恢复正常。OneDrive本地缓存异常:OneDrive依赖本地缓存来管理同步目录的文件列表,个别文件夹可能出现缓存损坏或计数错误,导致返回的文件数量被限制在200。这种缓存问题是局部性的,其他未出现异常的文件夹未触发该问题;复制到本地目录后不再依赖OneDrive的缓存,自然能正确统计所有文件。
特殊文件属性或命名干扰:该文件夹中第201个及之后的文件可能带有OneDrive同步专属的特殊属性(如同步待处理标记),或是文件名包含会干扰FSO/
Dir函数的特殊字符、过长路径(复制后路径变短规避了限制)。复制到本地目录后,这些同步属性会被清除,路径或命名的影响也消失,因此函数能正常识别所有文件。OneDrive虚拟文件系统的局部限制:OneDrive的本地同步目录并非原生NTFS目录,而是通过微软的虚拟文件系统层实现映射。这个虚拟层在个别场景下可能存在文件读取数量的阈值限制,刚好在该文件夹触发了200个文件的上限,而其他文件夹因文件类型、同步顺序等因素未触发该限制。
内容的提问来源于stack exchange,提问作者Jamie Garroch - MVP

