使用 WinAPI 找出锁定文件的原因
Posted
技术标签:
【中文标题】使用 WinAPI 找出锁定文件的原因【英文标题】:Find out what's holding a lock on a file with WinAPIs 【发布时间】:2013-08-26 07:04:53 【问题描述】:有时,当我尝试删除我的一个进程的 exe 文件时,我从GetLastError
收到以下错误:
Error: 32
The process cannot access the file because it is being used by another process.
有没有办法使用 C++ 和 WinAPI 找出锁定该文件的原因?
【问题讨论】:
这是你想要的:***.com/questions/1990535/… @Naveen:谢谢。顺便说一句,不错的 CodeProject 文章。我需要阅读它。只是好奇,Unlocker
也是如何使用设备驱动程序解锁文件的吗?
@c00000fd:您需要设备驱动程序的唯一原因是能够在不死锁的情况下区分普通文件和命名管道。除此之外,这一切都可以从用户模式完成,尽管有一些困难(假设你有正确的权限)。您不需要需要驱动程序来解锁文件——例如,您可以将线程注入到另一个关闭句柄的进程中。或者您可以使用DuplicateHandle(..., DUPLICATE_CLOSE_SOURCE)
。但是驱动程序使事情变得容易得多。
@c00000fd:司机并不可怕。 (顺便说一句,这些不是“设备”驱动程序。)您只需说CreateFile("\\.\DriverObjectName")
为他们创建的对象打开一个HANDLE
,并使用DeviceIoControl
与他们通信。只要您不编写驱动程序(您不需要这样做...... Process Hacker 已经编写好了它,只需使用它提供的驱动程序)这有点容易。您只需要确保适当地调用CreateService
等,即可在正确的时间创建/删除/启动/停止驱动程序。
对于 Vista 及以上的解决方案,您可以使用Restart Manager。 Raymond Chen 有一篇关于这个主题的博客文章:How do I find out which process has a file open?。
【参考方案1】:
最适合我的解决方案可以基于@IInspectable 建议的文章。查看我对您帖子的其他回复here。
【讨论】:
以上是关于使用 WinAPI 找出锁定文件的原因的主要内容,如果未能解决你的问题,请参考以下文章
如何在c ++ winapi中获取活动文件资源管理器窗口的路径
如何在 Win x64 上使用 WinAPI 正确安装虚拟打印机?