我正在处理一个处理图像文件的程序。我遇到的问题是一些图像非常大,我不知道复制过程何时完成。现在代码是用C#编写的,并且使用FileSystemWatcher类来监视文件。唯一的问题是当另一个进程与文件完成时没有事件。
当前的逻辑是观察创建和更改的事件,而不是等待5秒,希望在那个时间点完成复制过程。虽然这适用于我的开发机器,但不幸的是客户报告整个过程的问题。
多年前,当我编写此代码时,我确实看到在较低级别,我认为它是DDK SDK的一部分,可以找到有关另一个程序如何访问文件的更多信息。
任何人都能说到这一点并指出我正确的方向吗?我确实希望它是C ++代码,而不是C#代码。
回答以下问题:
问题在于,其他进程是将程序正在监视的目录中的复制映像。一旦图像被完全复制,我的程序需要尽快开始处理图像。问题在于,一次会复制许多图像,有时会有数百张图像。由于每个图像都需要尽快处理,因此系统需要尽快知道图像是否已完全复制并可以处理。
我完全清楚没有办法通过WinSDK做我想做的事情,但我99.9%肯定可以通过WinDDK,也许我有错误的名字,我用Google搜索并得到&#34 ; Windows驱动程序工具包(WDK)"。我很确定SysInternals如何通过使用WDK级别函数来解决所有酷炫技巧。
答案 0 :(得分:-1)
您可能感兴趣的是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每隔几秒钟获得一次创建通知后,一旦你停止获得异常就知道另一个进程已经完成了该文件。