关于win32下,监控文件变化的问题

kamuchayu kamuchayu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
有一个软件,每12秒向一个目录下的某个文件做WriteFile操作,先在一个偏移位置WriteFile一个递增的时间戳,再在之后的偏移位置WriteFile其它内容,最后调用 FlushFileBuffer ,这样一分钟写5次。用process monitor监控后,如下图所示:



红框部分是写递增的时间戳操作


我的任务是监控这个软件对这个目录下的这个文件的每一次更新,然后解析文件内容,发送出去。

我用的API是 ReadDirectoryChangesW()结合完成例程,来监控这个目录下的这个文件,若这个目录下的文件更新就响应完成例程(回调函数),
具体使用的方法,参考了很多例子,应该问题不大,同时回调函数响应的次数也是一分钟五次,这个也没问题,也就是说文件的变化,都监控到了

那个软件每次在文件的一个位置写入递增的时间戳,正常应该是

...

第N次文件变化响应,然后读文件,读到的其中的时间戳是 20180503143009
第N+1次文件变化响应,然后读文件,读到的时间戳是 20180503143021

...

但总出现

...

第N次文件变化响应,然后读文件,读到的其中的时间戳是 20180503143009
第N+1次文件变化响应,然后读文件,读到的时间戳是 20180503143009

...

或者

...

第N次文件变化响应,然后读文件,读到的其中的时间戳是 20180503143021
第N+1次文件变化响应,然后读文件,读到的时间戳是 20180503143021

...

也就是说,每监控到一次文件改变后,我去读这个文件内容中的的时间戳部分,时间戳应该是递增的。按理说,监控到文件改变后,之前的写操作应该都flush到磁盘了,不应该出现上述情况。

我怀疑是不是 这个ReadDirectoryChangesW()的机制,顶多是只能通知到文件的变化,但并不保证,在收到回调通知后,内容是否彻底被FlushFileBuffer到了磁盘。

请问 大家对这块有好的建议吗?
...全文
评论 10
收藏 已收藏
分享
返回顶部
kamuchayu
进程/线程/DLL 15,465 成员 49,169 内容