文件被哪个进程锁定?
Posted
技术标签:
【中文标题】文件被哪个进程锁定?【英文标题】:File locked by which process? 【发布时间】:2011-01-29 14:24:06 【问题描述】:.Net 中有没有办法准确找出哪个进程锁定了一个文件?
编辑:我这样做是因为我想让我的用户知道他们无法修改/打开文件,因为目前他们正在使用另一个程序(例如Excel) 已打开。希望这会有所帮助。
【问题讨论】:
这些信息将毫无用处,因为当你用它做某事时,它已经不再准确了。 真的是乔希吗?你确定... @SpaceghostAli 文件总是被无限期锁定,不是吗? 相关:***.com/questions/1304/… @Josh Stodola 信息不会没用,我给了这个问题 +1,因为我在生产系统中有一个用例,这些信息会非常方便 【参考方案1】:对此的简短回答是否定的。
不过,长篇大论的答案是,您可以使用各种 API 调用和 WMI 方法来查找此信息,但不要指望它会快速简单。
如果您想使用 API 调用,请查看带有 SYSTEM_PROCESS_INFORMATION 参数的 NtQuerySystemInformation 函数。这是美妙的免责声明附带的那些可爱的“无证”方法之一:
NtQuerySystemInformation 可能是 将来更改或不可用 Windows 版本。应用 应该使用替代功能 列在本主题中。
所以我建议避免使用 WMI。
您可以使用WMI Win32_Process 类枚举当前在机器上运行的所有进程,然后枚举每个进程持有的所有句柄,直到找到您要查找的文件。不幸的是,没有简单的方法可以去“嘿,哪个进程正在锁定这个文件”,它只能以相反的方式工作,你必须在进程列表中搜索,直到找到锁定你感兴趣的文件的那个。
我会推荐一篇关于 CodeProject 的不错的小文章,标题为 How To: (Almost) Everything In WMI via C# Part 2: Processes。 (如果你喜欢这种东西,第 1 部分也很不错)
【讨论】:
【参考方案2】:嗯...这不完全是 .NET 的方式...但是假设您只是想使用简单的实用程序进行查找,请查看 Handle from SysInternals。
【讨论】:
我认为 Irwin 是在询问如何以编程方式进行操作,我认为这对他没有帮助。 @Simon 好吧,从技术上讲,他可以捕获异常,然后以编程方式调用此命令行工具来获取当前使用该文件的进程。远非理想,是的,但有可能!【参考方案3】:看起来有人已经解决了这个问题(你也可以学习一些法语:))
http://www.axcis.com.au/bb/viewtopic.php?p=505
【讨论】:
这是进程的活动文件。他正在寻找反之亦然。 True - 如果它不是性能关键,您可以枚举所有查找文件的进程的输出。 当我为 Novell 服务器实现这样的事情时,我不得不像那样倒退——搜索所有文件以查找文件。以上是关于文件被哪个进程锁定?的主要内容,如果未能解决你的问题,请参考以下文章