PHP unlink()调用Windows文件权限问题

我正在构build跨平台的实用程序,安装来自各种来源的东西,包括混帐。 在某一点上,我需要消除git仓库 – 通过同一个cmd会话中的相同的PHP应用程序创build – 并获得权限错误:

[Symfony\Component\Filesystem\Exception\IOException] Failed to remove file "c:\users\ieuser\appdata\local\openserver\.cache\ama-team\vagranted\resource-sets\54b90db6\artifact\.git\objects\f5\e1818e5467665f1f597fb7e044b3f78eabd55e": unlink(c:\users\ieuser\appdata\local\openserver\.cache\ama-team\vagranted\resource-sets\54b90db6\artifact\.git\objects\f5\e1818e5467665f1f597fb7e044b3f78eabd55e): Permission denied. 

这个文件已经存在(并且不是目录),它不是通过fopen或者类似的东西打开的,php getenv()调用返回的是拥有这个文件的IEUser,icacls告诉我这个用户可以完全控制指定的文件(输出中的F),我可以轻松地从资源pipe理器手动删除此文件。 所以在顶层看来,一切都是正确的 – 什么可能会阻止我删除文件从PHP脚本运行在所有者用户?

答案结果很简单。 Windows(事实上,它是NTFS,我猜)有一个只读的文件属性,哪个git似乎把所有它的内部文件(提交blob)。 递归清除该属性允许我按照需要清除存储库。