如何在Windows中监控另一个进程的文件访问?

3
我正在开发一个处理图像文件的程序。现在遇到的问题是一些图片非常大,我不知道复制过程何时结束。目前代码是使用C#编写,并使用FileSystemWatcher类监视文件。唯一的问题是没有事件可用来判断其他进程是否完成对该文件的处理。
目前的逻辑是监视创建和更改事件,然后等待5秒钟,以期望在此时间点之前复制过程已经完成。虽然这在我的开发机器上有效,但客户报告整个过程存在问题。
多年前,当我编写此代码时,我确实看到在较低层次上(我认为是DDK SDK的一部分),可以了解有关另一个程序如何访问文件的更多信息。
有人能否就此发表意见并指导我方向?我希望它是C++代码,而不是C#代码。
回答以下一些问题:
问题在于其他进程将图像复制到我程序监视的目录中。一旦图像完全复制,我的程序需要尽快开始处理图像。问题在于很多图片,有时候是数百张图片,会同时复制。由于每张图片都需要尽快处理,因此系统需要尽快知道图像已完全复制并可以进行处理。
我完全清楚通过WinSDK无法实现我想做的事情,但我99.9%肯定通过WinDDK是可能的,也许我名称有误,我谷歌搜索得到的是“Windows Driver Kit (WDK)”。我相信SysInternals实现所有酷炫功能的方式就是使用WDK级别的函数。

我猜你可以使用dll注入,并监视对fclose()的调用。但是如果这是你自己的进程,那么有什么阻止你将文件完成事件输出到stdout呢? - user4442671
我不知道在win32 API中如何实现这一点。Sysinternals有一些很棒的工具,可以让你窥探谁打开了哪些句柄,因此可以轮询文件句柄是否仍然打开。问题是,我认为你必须深入到win32下面几乎没有文档记录的空间中去做这件事。但是,如果文件已经以独占方式打开,您可以轮询该文件,定期尝试打开它。如果其他进程仍然锁定文件,则无法打开它。 - user4581301
1个回答

0

你可能会对Sysinternals Procmon工具感兴趣。除了其他功能外,它还监视文件访问并提供大量详细信息。 不幸的是,源代码不可用,但这里有一个关于先前版本(Filemon)的线程,由一个遇到类似问题的人发起。

此外,你可能想看看开源替代方案,它可能有你要找的代码。

或者,你可以将ProcMon用作监视工具并解析其输出。使用内置的过滤功能,你将能够将日志文件条目限制为特定文件夹和文件访问事件类型/数据。


[更新]

最近我有机会为我的一个项目重新审视这个问题,我发现调用

File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None)

如果文件仍被另一个进程使用,将抛出 IOException 异常。

所以,你可以在 FileSystemWatcher 收到 Created 通知后每隔几秒钟调用 File.Open,一旦停止收到异常,你就知道另一个进程已经完成了对文件的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接