检查文件访问,获取进程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的主要内容,如果未能解决你的问题,请参考以下文章
获取 PermissionError:[WinError 32] 进程无法访问该文件,因为它在 scikitlearn GridSearchCV 期间正被另一个进程使用