有一个软件,每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到了磁盘。请问 大家对这块有好的建议吗?

解决方案 »

  1.   

    建议直接Hook 这几个API
      

  2.   

    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
      

  3.   


    这里的方法也是用的 ReadDirectoryChangesW 吗?
      

  4.   

    FDump - Dumping File Sectors Directly from Disk using Logical Offsets http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usin
      

  5.   

    WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/
      

  6.   

    是一些读取磁盘实际扇区的方法,达不到事件通知的效果。
    这个有些复杂,其中的MonitoringFileBuilder这个硬是没弄明白怎么用不是我不深入研究,而是时间紧同时要求上必须用事件通知的方式,因为之前有同事用PYTHON实现了这个功能,没出现类似问题,因此组织上也想通过
    这种事件通知的方式来实现。
    您知道为什么python的文件变化通知功能没有这个问题吗? 您看还有别的方法推荐吗?
      

  7.   

    python的文件通知难道不是调用Windows API实现的吗?
    用API Monitor监视Python是怎么调用Windows API实现的。