【问题标题】:How can I find which process has opened a specific file?如何找到打开特定文件的进程?
【发布时间】:2023-03-26 21:37:02
【问题描述】:

如何找到打开了特定文件的进程,以及它们的打开、访问和共享模式?此外,是否可以更改流程的这些值?或者如果文件已经被另一个进程以独占方式打开,是否可以打开文件进行读取?

请注意,我不想使打开文件的进程句柄无效。我只是希望能够访问该文件(如果可能的话)。

(我主要询问的是 Windows,但欢迎其他平台的解决方案,因为它们有助于社区的知识。)

编辑:我为我的第一个问题 herethere 找到了一些答案。

编辑 2:感谢大家提供您提到的工具,但我主要是在寻找编程技术(例如使用 Win32 API)。

【问题讨论】:

  • @Hosam Aly:“但我主要是在寻找编程技术”:也许你下次应该把它放在前面的问题中?
  • @Mitch,谢谢。对此我很抱歉。下次我会更小心的。
  • 显然restart manager 可以在 Windows Vista 及更高版本中做到这一点
  • 您可以使用 ntdll.dll 来获取所有打开的句柄和 NTQueryFileInformation 来获取路径,而不是 starat 管理器:stackoverflow.com/questions/26082122/… 查看链接代码的 cmets。

标签: winapi file


【解决方案1】:

【讨论】:

  • 感谢您的帮助@Mitch。请接受我之前没有提到“程序化”的道歉。
  • @Hosam Aly:嘿没问题。我的评论可能听起来有点严厉,这不是故意的。
【解决方案2】:

对于 windows,我知道 Sysinternal (www.sysinternals.com) 的一个工具:handle.exe。

【讨论】:

    【解决方案3】:

    有一个名为Unlocker 的实用程序可以告诉您哪个进程获得了资源的锁定。

    【讨论】:

    【解决方案4】:

    对于 unix,您可以使用 fuser:

    lnx0:i386_linux26> fuser -v a.cpp
    
                         USER        PID ACCESS COMMAND
    a.cpp                nabcdefg    3952 f....  less
    

    【讨论】:

      【解决方案5】:

      是Linux系统下的lsof命令。

      【讨论】:

        【解决方案6】:

        我不确定是否有办法完全按照您的意愿行事,但我知道使用 System.Diagnostics.Process 类(至少在 .Net 中)您可以打开进程并查看某些属性:

        System.Diagnostics.Process[] procArray = System.Diagnostics.Process.GetProcessesByName("notepad");
        foreach (System.Diagnostics.Process proc in procArray) {
            //do something with the process...
        }
        

        看看Process类,可能有一个属性或者集合可以获取你要找的数据。

        【讨论】:

        • 我很确定你不能通过这条路线检查文件锁。
        • 也许直接通过 P/Invokes 使用 Win32 api 并使用 .Net 获取进程句柄?
        猜你喜欢
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 2010-09-21
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        相关资源
        最近更新 更多