Winapi 如何找到哪个进程打开了特定文件?

Winapi 如何找到哪个进程打开了特定文件?,winapi,file,Winapi,File,我如何找到哪些进程打开了特定文件,以及它们的打开、访问和共享模式?此外,是否可以更改流程的这些值?或者,如果一个文件已经被另一个进程以独占方式打开,那么它甚至可以打开以进行读取吗 请注意,我不想使打开文件的进程的句柄无效。我只想能够访问该文件(如果可能的话) (我主要问的是Windows,但也欢迎其他平台的解决方案,因为它们有助于社区的知识。) 编辑:我为我的第一个问题找到了一些答案 编辑2:感谢大家提供您提到的工具,但我主要寻找编程技术(例如使用Win32 API)。 有一个名为的实用程序,它

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

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

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

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

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


有一个名为的实用程序,它告诉您哪个进程已锁定资源。

对于windows,我从Sysinternal(www.sysinternals.com)了解到一个工具:handle.exe。

对于unix,您可以使用
fuser

lnx0:i386_linux26> fuser -v a.cpp

                     USER        PID ACCESS COMMAND
a.cpp                nabcdefg    3952 f....  less

这是Linux系统下的lsof命令。

我不确定是否有办法完全按照您的要求执行,但我知道使用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类,也许有一个属性或集合可以获取您要查找的数据。

@Hosam Aly:“但我主要是寻找编程技术”:也许您下次应该把这个问题放在前面?@Mitch,谢谢。对此我很抱歉。下次我会更加小心。显然,Windows Vista和更高版本可以做到这一点,而不是Start manager,您可以使用ntdll.dll获取所有打开的句柄,并使用NTQueryFileInformation获取路径:查看链接代码的注释。感谢您的帮助@Mitch。请接受我的道歉,因为我之前没有提到“程序性的”。@Hosam Aly:嘿,没问题。我的评论听起来可能有点严厉,这并不是故意的。这实际上是我的Windows“必备”列表中。。。我发现不管我想不想,我在安装Windows后的一周内就把它安装好了。我很确定你不能通过这个途径检查文件锁。也许直接通过P/Invokes使用Win32 api并用.Net获取进程句柄?