【问题标题】:File locked by which process?文件被哪个进程锁定?
【发布时间】:2011-01-29 14:24:06
【问题描述】:

.Net 中有没有办法准确找出哪个进程锁定了一个文件?

编辑:我这样做是因为我想让我的用户知道他们无法修改/打开文件,因为目前他们正在使用另一个程序(例如Excel) 已打开。希望这会有所帮助。

【问题讨论】:

  • 这些信息将毫无用处,因为当你用它做某事时,它已经不再准确了。
  • 真的是乔希吗?你确定...
  • @SpaceghostAli 文件总是被无限期锁定,不是吗?
  • @Josh Stodola 信息不会没用,我给了这个问题 +1,因为我在生产系统中有一个用例,这些信息会非常方便

标签: .net process file-locking


【解决方案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 服务器实现这样的事情时,我不得不像那样倒退——搜索所有文件以查找文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2013-07-17
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多