检查文件访问,获取进程ID

Posted

技术标签:

【中文标题】检查文件访问,获取进程ID【英文标题】:Check file access, get process id 【发布时间】:2010-02-20 21:19:09 【问题描述】:

是否可以检查特定目录中的文件是否被进程 X 访问并获取进程 ID(在 c++ 或更好的 c# 中)?

我认为必须有一个时刻,文件在被进程打开之前被进程访问。 (例如杀毒工具也在使用这个)

例子:

    我双击一个txt文件 在记事本自动打开之前,c++或c#程序应该在记事本打开之前获取它的进程ID。

这可能吗?有人告诉我,这可以用低级挂钩来完成,但我还没有找到“文件访问挂钩”。

谢谢。

【问题讨论】:

什么操作系统? unix 上有 inotify 和 dnotify。 @Chris 但 unix 通常没有 c# 或记事本 【参考方案1】:
HWND hWnd = FindWindow(0, "Untitled - Notepad"); //Specify the title of notepad.exe
DWORD ProcessId = GetWindowThreadProcessId(hWnd, &ProcessId);

【讨论】:

【参考方案2】:

我认为唯一的方法是挂钩 API 函数。看到这个:http://www.codeproject.com/KB/system/hooksys.aspx

API 挂钩是一项非常困难的任务,并且容易出现很多错误。如果必须这样做,我建议使用第三方库,例如这里的:http://madshi.net/

您可能希望挂钩与打开文件相关的函数。除非您真的知道自己在做什么,并且除非您有充分的理由,否则我不建议您这样做;就像我之前说的,它会导致很多东西停止工作。例如,API 挂钩可能与安全设置冲突,甚至与防病毒或防火墙等安全软件发生冲突。

如果可能的话,从头开始在 C# 中执行此操作更加困难。

【讨论】:

【参考方案3】:

据我所知,没有像上面描述的 C# 那样直接监视文件的方法;因为这些低级任务总是在内核模式下完成。

您将需要创建一个系统文件驱动程序,这不是一项简单的任务,但如果您想自己尝试一下,here is where you should start from。

【讨论】:

以上是关于检查文件访问,获取进程ID的主要内容,如果未能解决你的问题,请参考以下文章

文件访问权限:更改用户ID

尝试获取客户端进程可执行路径时访问被拒绝错误

获取 PermissionError:[WinError 32] 进程无法访问该文件,因为它在 scikitlearn GridSearchCV 期间正被另一个进程使用

Delphi - 查找正在从我的程序访问文件的进程

原创访问Linux进程文件表导致系统异常复位的排查记录

File.Exists + File.Move 错误“该进程无法访问该文件,因为它正被另一个进程使用。”