如何在VC ++中设计filewatcher /目录观察器?

时间:2011-01-04 18:46:41

标签: visual-c++ filesystems

我是VC ++和编程的新手。我有一个任务,我应该在VC ++中设计一个文件监视器。

问题就是这样:

我必须不断监视一些日志文件;每当特定的日志文件被删除时(这个删除由其他程序完成),我必须打开一个TextFile并将一些数据和时间戳写入其中。

我该如何解决?请帮助!!

4 个答案:

答案 0 :(得分:1)

首先,您需要设置一个系统来监控该文件夹中的文件事件。 要开始使用,请查看FindFirstChangeNotification()。

你基本上可以从中获得一个等待处理。

然后,是我,我有一个等待该事件的线程。每次事件触发时,线程都会恢复,查询更改详细信息(什么文件),然后执行所需的操作,然后再次继续在该句柄上休眠。

你需要一些额外的信号量或其他东西来中断这个工作线程并将其唤醒以便你可以告诉它退出。操作简单:让线程的主循环执行WaitForMultipleObjects - “唤醒信号量”和FindFirstChangeNotification句柄。当你醒来时,检查哪个甚至通知你,然后处理文件更改或退出。

答案 1 :(得分:0)

MFC处理它的方式略有不同(稍微)但是要使用Win32 API执行此操作,您通常使用Directory Management Functions为文件所在的目录设置更改通知句柄然后,您可以等待句柄,当该目录内的某些事情发生时,等待完成,您可以检查它是否是对您关注的文件的更改。

查看FindFirstChangeNotificationReadDirectoryChangesW的文档以获取更多信息。

答案 2 :(得分:0)

如果您有足够的权限,请尝试使用Windows Management Instrumentation(WMI)。 AFAIK它也是处理文件系统事件的最有效方法。 分别处理或查询__InstanceDeletionEvent,__ InstanceModificationEvent或__InstanceCreationEvent以获取删除,修改或创建事件,并过滤所需的文件和目标路径。

查看WMI Reference / C ++调用。

有关完整示例,请查看at codeproject querying example

答案 3 :(得分:0)

我强烈建议您考虑使用实施here。此API不是100%可靠,但此代码可以很好地包装它。如果您的文件系统流量是本地的而且不是太频繁,那么它应该适合您。