一种基于Windows监控的实时同步的方法技术

技术编号:19544487 阅读:29 留言:0更新日期:2018-11-24 20:44
本发明专利技术公开了一种基于Windows监控的实时同步的方法,本方法使用ReadDirectoryChanges方法监控源文件实现实时同步,同时采取遍历查询文件、通过内存映射建立文件记录表、完美hash方式查表对比的完整同步方法对实时同步进行查缺补漏,同时建立使用快照方法的容错机制对特殊文件补救。本发明专利技术能够减少数据的丢失,同时也能够减少实时同步所花时间与资源开销,即时性更强。

A Real-time Synchronization Method Based on Windows Monitoring

The invention discloses a method of real-time synchronization based on Windows monitoring. The method uses ReadDirectoryChanges method to monitor source files to achieve real-time synchronization, and adopts complete synchronization method to check real-time synchronization by traversing query files, establishing file record tables through memory mapping, and comparing table lookups in perfect hash mode. At the same time, a fault-tolerant mechanism using snapshot method is established to remedy special files. The invention can reduce the loss of data, reduce the time and resource overhead of real-time synchronization, and has better instantaneity.

【技术实现步骤摘要】
一种基于Windows监控的实时同步的方法
本专利技术属于计算机Windows系统文件操作领域,尤其涉及一种基于Windows监控的实时同步的方法。
技术介绍
在文件频繁使用过程中,用户通常有过这样的经历:因为误操作、系统崩溃、病毒感染导致自己的辛苦成果被修改或被删除。虽然会有定时做文件备份,但还原的只能是上个时间段的备份点,而这段期间的努力都将丢失,用户苦于此类情况而不得解。能不能实时记录文件的变化并对其备份的功能,出于这种考虑,文件实时同步功能的需求因此孕育而生。文件实时同步就是实时监控源文件夹的内容,当源文件夹中的文件发生改变时能实时的将源文件夹中发生改变的文件、文件夹同步到目标位置。要实现文件的实时同步,重点在于实时的文件监控与即时的文件同步上面。实时文件监控:实时监控源路径文件,能快速获知源文件的新增、修改、改名、删除等变动情况;即时的文件同步:在实时获取了变动情况后,能即时地将变动文件准确且有效地同步到目标位置文件上,同时还需要根据用户需求过滤一些用户不关心的文件和文件类型。在实时文件监控方面,微软提供了两个系统API(FindFirstChangeNotification与ReadDirectoryChanges)用于监控和获取文件夹内文件的变动消息。FindFirstChangeNotification能获取到指定文件夹下所有文件变动消息,优点是快速,无论源路径发生了任何改变,该API都能快速获取并返回结果,但该方法并不能得知具体哪些文件发生哪些变动。由于无法得知具体变动信息,在同步方面只能采取遍历全文件夹,与目标文件夹的文件进行对比,找出发生变动的文件,然后再同步。这样每次发生变动就需要进行一次全文件遍历,其所花时间与资源开销都会很大,导致即时性上就差强人意,这也是FindFirstChangeNotification方法的致命缺陷。ReadDirectoryChanges能具体获知哪些文件发生了哪些变动,但由于需要系统后台花费要比FindFirstChangeNotification更多时间为我们获取具体文件变动信息,这导致该方法在处理大批量变动的时候,会出现迟钝甚至出现丢失文件变动的消息,在大批量文件变动情况下,无法捕捉所有的文件变动消息,是使用ReadDirectoryChanges方法不得不慎重考虑的问题。ReadDirectoryChanges能获取到文件具体的变动信息,无需花费额外开销,都能快且准确地将变动内容同步到目标位置文件,这是明显强于FindFirstChangeNotification方法的,但是容易丢失数据也是不可回避的问题。
技术实现思路
鉴于微软提供的两个系统API用于监控和获取文件夹内文件的变动消息存在的上述缺陷,本专利技术提供了一种基于Windows监控的实时同步的方法,通过该方法,能够减少数据的丢失,同时也能够减少实时同步过程中查找并对比文件所花时间与资源开销,即时性强。为解决上述技术问题,本专利技术所采用的技术方案是:一种基于Windows监控的实时同步的方法,其特征在于:通过ReadDirectoryChanges方法进行实时同步,每进行一次实时同步后,记录实时同步次数,实时同步的次数达到设定值后进行完整同步,完成完整同步后又通过ReadDirectoryChanges方法进行实时同步,实时同步的次数达到设定值后再进行完整同步,如此循环,直到结束。通知完整同步所需的实时同步次数可以人为设定,用户根据实际情况进行设定;除了通过实时同步的次数来控制是否完整同步之外,还可以通过完整同步的间隔时间来控制是否完整同步,至于具体的间隔时间也是用户根据实际情况进行设定,当然也可以通过两种方式同时来控制是否进行完整同步。比如可以设定实时同步的次数为5次那么在完成5次实时同步后,就会进行一次完整同步;比如可以设定完整间隔时间为2min,那么在每隔2min后进行一次完整同步。用户如果选定只通过实时同步次数来控制完整同步,那么只有每满5次实时同步后才会进行一次完整同步;用户如果选定只通过完整同步时间控制,那么只有每到2min后才会进行一次完整同步;用于如果选用两种方式来控制完整同步,那么在每到2min或者实时同步每满5次都会进行一次完整同步。所述通过ReadDirectoryChanges方法进行实时同步的具体流程为:通过CreateIoCompletePort方法对源文件路径创建IO完成端口句柄,交由ReadDirectoryChanges建立对源路径文件监控,同时创建监控线程与消息处理线程,监控线程通过GetQueuedCompletionStatus方法获取完整端口状态,抓取文件变动信息,放入消息队列里;消息处理线程则从消息队列里获取文件变动信息,针对不同的变动类型进行过滤和分类处理。所述完整同步的具体流程为:在接到完整同步通知后,先通过FindFirstFile方法遍历查询源路径文件,采用广度遍历方法用循环方式来减少递归方式带来的额外压栈出栈的开销,增加执行速度,每查询到一个文件都进行一次过滤,过滤掉用户不关心的文件,然后通过完美hash方法(即对文件名hash并将其hash值对指定值取模计算索引,然后用该索引找到对应的文件记录表进行存储查询),从文件记录表找到对应文件信息进行对比:value=hash(filename);num=value%n;lastfileinfo=filelist[num].query(filename);ret=curfileinfo.size!=lastfileinfo.size||curfileinfo.fwritetime!=lastfileinf.fwritetime;如果该文件发生变动,则将变动信息放入变动文件表中,待遍历结束后,集中处理变动文件表里的变动信息,通过读写文件的方式,完完整整地将源文件复写到目标位置文件里。待处理完后更新最新信息到文件记录表中。遇到占用、权限等问题导致同步文件失败时记录失败次数并还原其文件变状态写到文件记录表中,待下次完整同步时再处理。处理完变动文件表后,对于多次同步失败的变动文件,先对其源路径创建快照,再从快照中读取对应文件并同步到目标位置,同时更新文件信息到文件记录表中。每完成一次实时同步后都建立一张文件记录表,用于记录当前同步后的所有文件信息。使得完整同步不必遍历目标位置文件,从而减少文件遍历带来的时间开销。遍历文件的目的就是为了对比当前源文件信息与上次同步后记录的文件信息,通过对比文件信息的不同找出发生过变动的文件。当某个文件在遍历结果里存在而文件记录表里不存在时,即该文件为新增文件;当某个文件在文件记录表里存在而在遍历的结果里不存在,则该文件为已删除的文件;当文件的大小与修改时间不同时,则表示该文件的数据发生过变动;文件的重命名无法通过对比方法直接获知,但逻辑上与删除一个文件并新增另一个文件相等。为了减少文件查找的时间开销,增加了完美hash查表,先将记录了庞大文件信息的文件记录表拆分为多个链表,通过对关键字hash取值,再将获取的hash值取模计算索引就能找到对应的记录表进行查询。这样将单表深度转变为多表广度,便能加快查表的速度。所述文件记录表通过内存映射文件保存在磁盘上。使用时再加本文档来自技高网
...

【技术保护点】
1.一种基于Windows监控的实时同步的方法,其特征在于:通过ReadDirectoryChanges方法进行实时同步, 每进行一次实时同步后,记录实时同步次数,当完整同步间隔时间达到设定值或者实时同步的次数达到设定值后进行完整同步,完成完整同步后又通过ReadDirectoryChanges方法进行实时同步,当完整同步间隔时间达到设定值或者实时同步的次数达到设定值后再进行完整同步,如此循环,直到结束。

【技术特征摘要】
1.一种基于Windows监控的实时同步的方法,其特征在于:通过ReadDirectoryChanges方法进行实时同步,每进行一次实时同步后,记录实时同步次数,当完整同步间隔时间达到设定值或者实时同步的次数达到设定值后进行完整同步,完成完整同步后又通过ReadDirectoryChanges方法进行实时同步,当完整同步间隔时间达到设定值或者实时同步的次数达到设定值后再进行完整同步,如此循环,直到结束。2.根据权利要求1所述的一种基于Windows监控的实时同步的方法,其特征在于:每完成一次实时同步和完整同步后都建立一张文件记录表,用于记录当前同步后的所有文件信息。3.根据权利要求2所述的一种基于Windows监控的实时同步的方法,其特征在于:所述文件记录表通过内存映射文件保存在磁盘上。4.根据权利要求1所述的一种基于Windows监控的实时同步的方法,其特征在于:所述通过ReadDirectoryChanges方法进行实时同步的具体流程为:通过CreateIoCompletePort方法对源文件路径创建IO完成端口句柄,交由ReadDirectoryChanges建立对源路径文件监控,同时创建监控线程与消息处理线程,监控线程通过GetQueuedCompletionStatus方法获取完整端口状态,抓取文件变动信息,放入消息队列里;消息处理线程则从消息队列里获取文件变动信息,针对不同的文件变动信息处理变动数据;处理完变动数据后发送变动数据到实时同步线程进行实时同步。5.根据权利要求2所述的一种基于Windows监控的实时同步的方法,其特征在于:所述完整同步的具体流程为:在接到完整同步通知后,先通过FindFirstFile方法遍历和对...

【专利技术属性】
技术研发人员:袁翔
申请(专利权)人:成都傲梅科技有限公司
类型:发明
国别省市:四川,51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1