如何在VC++中设计一个文件监视器/目录监视器?

3

我刚接触VC++和编程。我的任务是在VC ++中设计一个文件监视器。

问题如下:

我需要不停地监控一些日志文件;每当某个特定的日志文件被删除(这个删除操作是由其他程序完成的),我都要打开一个TextFile,并将一些数据和时间戳写入其中。

我该怎么做呢?请帮帮我!!


请每个问题只提出一个问题。这将有助于您获得更相关的答案。 - Greg Hewgill
@Greg - 感谢您的评论。我已经修改了问题。 - Dolly
4个回答

1

首先,您需要设置一个系统来监视该文件夹的文件事件。

要开始,请查看FindFirstChangeNotification()。

基本上,您将从中获得可等待的句柄。

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

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


0

MFC 处理方式略有不同 (略有),但使用 Win32 API 进行此操作时,您通常会使用 目录管理函数 设置一个更改通知句柄以监视文件所在的目录。然后,您可以等待该句柄,当目录内发生任何事件时,您的等待就会完成,然后您可以检查它是否是您关心的更改文件。

请参阅 FindFirstChangeNotificationReadDirectoryChangesW 的文档以获取更多信息。


0

如果您拥有足够的权限,请尝试使用Windows管理工具(WMI)。据我所知,这也是处理文件系统事件最有效的方法。

处理或查询__InstanceDeletionEvent、__InstanceModificationEvent或__InstanceCreationEvent以分别处理删除、修改或创建事件,并过滤您想要的文件和目标路径。

查看WMI参考/C++调用。

有关完整示例,请参阅codeproject查询示例


0

我强烈建议您考虑使用这里的实现。虽然这个API不是100%可靠的,但这段代码很好地封装了它。如果您的文件系统流量是本地的且不太频繁,那么它应该能很好地为您工作。


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