自从我开始使用Windows 7以来,这个问题一直困扰着我。我不时在类似的论坛上看到类似的问题,但是从来没有看到答案。这是几乎总是重现它的两种情况:
探索者之路
- 使用资源管理器,导航到包含至少一个exe文件的目录
- 立即上一个目录
- 删除刚刚导航到的目录
- Yields Folder Access Denied对话框指出您需要执行此操作的权限,需要管理员权限才能更改此文件夹,并使用按钮Again和Cancel 进行更改。
- 点击“重试”永远不会立即生效。等待一分钟左右,然后再次单击可以正常工作
注意:如果在第2步中等待一分钟或更长时间再上一个目录,则不会发生此问题,并且可以删除该文件夹
Visual Studio方式
- 建立一个产生exe文件的项目
- 运行可执行文件然后关闭它
- 立即再次构建项目(例如,通过更改源文件中的单个字符)
- 产生致命错误LNK1168:无法打开/path/to/the.exe进行写入
注意:如果在步骤2中等待一分钟或更长时间再重新构建,则不会发生此问题。
一些规格
- 在VS2008 / 2010/2011上的Windows 7 32位和64位上均会发生
- 发生在3台不同的机器上
- 我没有任何类型的病毒扫描程序
- 我确实禁用了一堆服务,但是没有什么可以阻止Windows正常运行,也禁用了UAC
- 发生在任何类型的光盘上
- 我总是使用管理员组中的用户帐户
显然,这两种情况都非常相似,并且具有很高的可重复性。因此,我认为出于某种原因必须打开该文件,然后再将其释放。但是,使用sysinternals
handle -a
该问题的exe文件从不显示。(这是使用handle的正确方法,对吗?)因此,在explorer / VS报告他们无法访问文件时,handle.exe表示该文件未在任何地方使用。这使我变得一无所知,所以我想知道是否有人可以提出解决方案:为什么会发生这种情况,以及如何解决?
更新以回答提出的问题:
- 我无法在安全模式下重现该问题
- 一堆的外壳扩展安装。从SellExView,这里是所有计算机通用的非Microsoft软件:NitroPDF,WinRAR,TortoiseGit,TortoiseSvn,NVidia。我会发现Tortoise的最可疑,尽管将“状态缓存”选项都设置为“仅针对一个文件夹的状态缓存,没有递归覆盖”,即没有TortoiseCache.exe运行。
- 对于资源管理器问题,ProcessExplorer不显示可执行文件。虽然它确实显示了可执行文件的目录,但是即使将其删除后仍会继续显示它,因此似乎没有任何关系
- 对于VS问题,即使在目标目录上没有打开资源管理器窗口时,VS也会发生这种情况。同样,ProcessExplorer不会显示可执行文件,也不会显示可执行文件所在的目录。请注意,在VS的这种“模式”下,仅在运行可执行文件时才会出现问题。如果不运行它,我可以不断构建它。
- 在“ VS模式”下,并且在可执行文件的目录中打开了一个资源管理器窗口(仅使用C#exe测试),这变得很奇怪:我无法再次构建,因为VS抱怨该exe正在被另一个进程使用。但是,如果我从打开的资源管理器窗口中删除了exe,则此方法有效,因此构建成功。同样,ProcessExplorer中没有任何引用。这似乎与我的发现与handle.exe匹配(PE和handle始终在内部不使用相同的API吗?)
更新2 它不能只是资源管理器:在杀死explorer.exe之后,VS问题仍然存在。
Update 3 使用Asher建议的Process Monitor揭示了一个有趣的事实:对于资源管理器模式,打开目录后有10个对IRP_MJ_CREATE的调用。但是,只有9个呼叫IRP_MJ_CLEANUP。所有这些调用都源自shell32.dll,因此绝对不是第三者安装问题。显然是导致该问题的缺少IRP_MJ_CLEANUP的原因:打开目录后恰好1分钟,系统进程本身发出了IRP_MJ_CLEANUP调用,文件被释放并被删除。
但是,我仍然不知道为什么会这样。我所做的某些更改是否触发了浏览器错误?
解!在查看已禁用的服务时,我注意到Application Experience的描述,并引用了启动应用程序时处理应用程序兼容性缓存请求的过程。听起来很熟悉。确实,在启动服务之后,我再也无法重现任何问题,并且ProcMon的输出是不同且较短的。有趣的是,因为再次停止服务后,一切仍然正常,procmon的输出仍然更短。
我在两台机器上进行了尝试,所有第3方的东西都运行良好,而且一切都还不错。
我不确定这是否是一个真正的错误(可以说“禁用服务后您会期望什么”),但是仅通过启动服务然后再次停止它来解决问题,这是不正常的。
赏金归功于可以对此提供更深入见解的任何人,其他@Asher则将我指向ProcMon,最终将我引向正确的方向。