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

kamuchayu 2018-05-11 04:44:37
有一个软件,每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到了磁盘。

请问 大家对这块有好的建议吗?
...全文
1347 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
encoderlee 2018-05-16
  • 打赏
  • 举报
回复
如果某次读到的内容,和上次一样,就关闭文件,重新打开,再读,重试几次
赵4老师 2018-05-15
  • 打赏
  • 举报
回复
python的文件通知难道不是调用Windows API实现的吗? 用API Monitor监视Python是怎么调用Windows API实现的。
赵4老师 2018-05-14
  • 打赏
  • 举报
回复
赵4老师 2018-05-14
  • 打赏
  • 举报
回复
FDump - Dumping File Sectors Directly from Disk using Logical Offsets http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usin
kamuchayu 2018-05-14
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 参考里面的例子fwatch: MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.DSP MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.C MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\MAKEFILE MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.INI MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\README.TXT
试了一下这个例子,还是出现这个问题。
kamuchayu 2018-05-14
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
FDump - Dumping File Sectors Directly from Disk using Logical Offsets http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usin
是一些读取磁盘实际扇区的方法,达不到事件通知的效果。
引用 7 楼 zhao4zhong1 的回复:
WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/
这个有些复杂,其中的MonitoringFileBuilder这个硬是没弄明白怎么用 不是我不深入研究,而是时间紧同时要求上必须用事件通知的方式,因为之前有同事用PYTHON实现了这个功能,没出现类似问题,因此组织上也想通过 这种事件通知的方式来实现。 您知道为什么python的文件变化通知功能没有这个问题吗? 您看还有别的方法推荐吗?
kamuchayu 2018-05-13
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 参考里面的例子fwatch: MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.DSP MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.C MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\MAKEFILE MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.INI MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\README.TXT
这里的方法也是用的 ReadDirectoryChangesW 吗?
赵4老师 2018-05-13
  • 打赏
  • 举报
回复
MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 参考里面的例子fwatch: MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.DSP MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.C MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\MAKEFILE MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.INI MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\README.TXT
kamuchayu 2018-05-11
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
建议直接Hook 这几个API
目前领导没考虑换其它方案,钩子程序还不太熟悉,而且我自己模拟那个写的软件,也没出现这样的问题。
zgl7903 2018-05-11
  • 打赏
  • 举报
回复
建议直接Hook 这几个API

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧