最近微软自动推送了 Windows 1709 版本的更新,其中 OneDrive 的更新导致绝大多数程序崩溃。
例如使用 Typora 软件,通过 Windows 的文件对话框打开保存在 OneDrive 中的文件会看到:
按照提示的 fstat 研究可以构建一个测试用例:
&"C:\wamp64\bin\php\php7.1.3\php.exe" -r "echo __DIR__; var_dump(stat(__DIR__)); var_dump(stat(dirname(__DIR__)));"
可以看到 无法获取 C:\Users\huzh\Onedrive 的信息,但是可以获得上级文件夹的信息。
查询可以发现:
Get-Item C:\Users\huzh\Onedrive
在 Mode 中多了一个 l ,对照另一台没有升级的电脑会看到没有这个 l
Get-Item C:\Users\huzh\Onedrive | Select-Object Name,Mode,Attributes
可以看到 ReparsePoint。猜测是 Windows 1709 版本的 OneDrive 中使用了 ReparsePoint 技术,导致了这个缺陷。
ReparsePoint 是什么,以及 Windows 1709 版本中1为什么需要使用 ReparsePoint 技术,这个等微软自己出来解释。
使用命令可以查询 ReparsePoint 相关信息
fsutil reparsepoint query C:\Users\huzh\Onedrive
为了尝试解决这个缺陷,在 OneDrive 的设置中去掉了“按需文件”,无效。
在 OneDrive 的 Office 中去掉了“使用 Office 2016 同步我打开的 Office 文件”,无效。
最后使用命令直接删除 ReparsePoint
fsutil reparsepoint delete C:\Users\huzh\Onedrive
成功。
因此直接删除 ReparsePoint 可能是必要条件,前面两个设置不知道是否有必要,不替微软测试了,让微软自己发布解决缺陷的补丁吧。
不过遗留问题是,每次重启电脑后好像都需要使用命令删除一次……