文件被哪个进程锁定?

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 服务器实现这样的事情时,我不得不像那样倒退——搜索所有文件以查找文件。

以上是关于文件被哪个进程锁定?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C#,如何确定是哪个进程锁定了文件?

检查文件是不是被进程文件句柄锁定

手动将文件与流程关联

检测文件是不是被另一个进程(或实际上是同一个进程)锁定[重复]

如何找出使用 .NET 锁定文件的进程?

如果给定文件或目录被锁定(由任何进程使用),如何检查命令行?