我正在处理一个处理图像文件的程序。我遇到的问题是某些图像非常大,我不知道复制过程何时完成。现在,代码是用C#编写的,并且正在使用FileSystemWatcher类监视文件。唯一的问题是,使用该文件完成另一个进程时没有事件。

当前的逻辑是监视创建和更改的事件,然后等待5秒钟,以希望在该时间点之前完成复制过程。虽然这可以在我的开发机器上运行,但不幸的是,客户报告了整个过程中的问题。

几年前,当我编写此代码时,我确实看到它是一个较低级别的东西,我认为它是DDK SDK或其他东西的一部分,有可能找到更多有关另一个程序如何访问文件的信息。

谁能说出来并指出正确的方向?我确实希望它是C++代码,而不是C#代码。

要回答以下一些问题:

问题是其他进程将镜像复制到程序正在监视的目录中。完全复制图像后,我的程序需要尽快开始处理图像。问题是很多图像,有时是数百张图像,将被一次复制。由于每个图像都需要尽快处理,因此系统需要尽快知道该图像已被完全复制并可以处理。

我完全知道没有办法通过WinSDK来完成我想做的事情,但是我有99.9%的把握可以通过WinDDK来做到这一点,也许我的名字有误,我用Google搜索得到了“Windows Driver Kit(WDK )”。我非常确定SysInternals发挥其所有出色技巧的方法是使用WDK级别的函数。

最佳答案

您可能感兴趣的是sys internals procmon工具。除其他功能外,它还监视文件访问,为您提供许多详细信息。
不幸的是,源不可用,但是这里的a thread about previous version(filemon)由某人启动,出现了与您相似的问题。

另外,您可能想研究open source alternative,它可能包含您要查找的代码。

或者,您可以use ProcMon as a monitor tool并解析其输出。使用内置的过滤器功能,您可以将日志文件条目限制为特定的文件夹以及文件访问事件的类型/数据。

[更新]

最近,我有机会针对我的一个项目重新审视了这个问题,我发现那是所谓的

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

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

因此,您可以做的是在从FileSystemWatcher调用File.Open收到Created通知之后,每隔几秒钟打开一次,一旦停止获取异常,便知道该文件已完成另一个过程。

10-06 15:34