CN108874999B - 一种基于Windows监控的实时同步的方法 - Google Patents

一种基于Windows监控的实时同步的方法 Download PDF

Info

Publication number
CN108874999B
CN108874999B CN201810613906.9A CN201810613906A CN108874999B CN 108874999 B CN108874999 B CN 108874999B CN 201810613906 A CN201810613906 A CN 201810613906A CN 108874999 B CN108874999 B CN 108874999B
Authority
CN
China
Prior art keywords
file
synchronization
real
time
time synchronization
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810613906.9A
Other languages
English (en)
Other versions
CN108874999A (zh
Inventor
袁翔
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chengdu Aomei Technology Co ltd
Original Assignee
Chengdu Aomei Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Chengdu Aomei Technology Co ltd filed Critical Chengdu Aomei Technology Co ltd
Priority to CN201810613906.9A priority Critical patent/CN108874999B/zh
Publication of CN108874999A publication Critical patent/CN108874999A/zh
Application granted granted Critical
Publication of CN108874999B publication Critical patent/CN108874999B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种基于Windows监控的实时同步的方法,本方法使用ReadDirectoryChanges方法监控源文件实现实时同步,同时采取遍历查询文件、通过内存映射建立文件记录表、完美hash方式查表对比的完整同步方法对实时同步进行查缺补漏,同时建立使用快照方法的容错机制对特殊文件补救。本发明能够减少数据的丢失,同时也能够减少实时同步所花时间与资源开销,即时性更强。

Description

一种基于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值取模计算索引就能找到对应的记录表进行查询。这样将单表深度转变为多表广度,便能加快查表的速度。
所述文件记录表通过内存映射文件保存在磁盘上。使用时再加载,从而减少大量内存占用。
与此同时,为了规避一些外在原因(如权限不足,文件独占等原因)导致文件无法同步的问题,增加了容错机制——记录多次无法完成同步的文件,创建一次快照,从快照里提取文件进行同步操作。
本发明相对于现有技术存在如下有益效果:
本发明通过ReadDirectoryChanges方法进行实时同步,然后在满足完整同步时间间隔或者实时同步次数之后又会进行一次完整同步,采用ReadDirectoryChanges方法进行实时同步能够能获取到文件具体的变动信息,无需花费额外开销,都能快且准确地将变动内容同步到目标位置文件,到达设定条件后进行完整同步,对采用ReadDirectoryChanges方法进行实时同步时丢失的文件进行查漏补缺。这样既无需在实时同步过程中查找变动文件,减少了查找对比时间与资源开销,即时性强,而且完整同步还能对实时同步时丢失的文件进行查漏补缺,不会丢失文件,保证文件的完整性。
附图说明
图1为FindFirstChangeNotification方法流程图;
图2为ReadDirectoryChanges方法流程图;
图3为完整同步流程图;
图4为完美hash查询示意图;
图5为本发明流程示意图。
具体实施方式
下面结合实施例对本发明作进一步的描述,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域的普通技术人员在没有做出创造性劳动前提下所获得的其他所用实施例,都属于本发明的保护范围。
在实时监控方面,微软提供了两个系统API(FindFirstChangeNotification与ReadDirectoryChanges)用于监控和获取文件夹内文件的变动消息。
FindFirstChangeNotification方法流程如图1所示,首先由FindFirstChangeNotification创建监控,然后由WaitForSingleObject等待变动通知,再由FindFirstFile遍历文件,对比两边文件信息并进行同步,然后由FindFirstChangeNotification继续创建新一轮监控,如此循环,就是FindFirstChangeNotification方法的同步文件的流程。从上述流程可以知道,这种方法需要遍历全文件夹,与目标文件夹的文件进行对比,找出发生变动的文件,然后再同步。这样每次发生变动就需要进行一次全文件遍历,其所花时间与资源开销都会很大,导致即时性上就差强人意。
ReadDirectoryChanges方法流程如图2所示,
在实时同步开始时,优先加载文件记录表,对于首次执行任务先遍历文件创建原始的文件记录表,然后进行一次完整同步。
然后,通过CreateIoCompletePort方法对源文件路径创建IO完成端口句柄,交由ReadDirectoryChanges建立对源路径文件监控,同时创建监控线程与消息处理线程,监控线程通过GetQueuedCompletionStatus方法获取完整端口状态,抓取文件变动信息,放入消息队列里,消息处理线程则从消息队列里获取文件变动信息,针对不同的变动类型(新增、修改、重命名、删除)过滤和分类处理,达到处理变动数据的目的,然后再进行文件同步,同步完成后通过ReadDirectoryChanges再次投入监控,如此循环即可。该方法在处理大批量变动的时候,会出现迟钝甚至出现丢失文件变动的消息,在大批量文件变动情况下,无法捕捉所有的文件变动消息,容易丢失数据。
本发明为了克服微软现有提供的FindFirstChangeNotification存在的所花时间与资源开销都会很大,导致即时性上就差强人意,而ReadDirectoryChanges又会丢失文件的缺陷,提出了一种基于Windows监控的实时同步的方法。
该方法使用ReadDirectoryChanges方法监控源文件实现实时同步,同时采取遍历查询文件、通过内存映射建立文件记录表、完美hash方式查表对比的完整同步方法对实时同步进行查缺补漏,同时建立使用快照方法的容错机制对特殊文件补救的方法,具体为:
在实时同步开始时,优先加载文件记录表,对于首次执行任务先遍历文件创建原始的文件记录表,然后进行一次完整同步。
然后,通过CreateIoCompletePort方法对源文件路径创建IO完成端口句柄,交由ReadDirectoryChanges建立对源路径文件监控,同时创建监控线程与消息处理线程,监控线程通过GetQueuedCompletionStatus方法获取完整端口状态,抓取文件变动信息,放入消息队列里。消息处理线程则从消息队列里获取文件变动信息,针对不同的变动类型(新增、修改、重命名、删除)过滤和分类处理,达到处理变动数据的目的,然后再进行文件同步,同步完成后通过ReadDirectoryChanges再次投入监控,如此循环即可。同时,每处理完一次变动后,记录文件变动次数,满一定次数后通知完整同步线程执行一次完整同步,如此循环,直到结束。
通知完整同步所需的实时同步次数可以人为设定,用户根据实际情况进行设定;除了通过实时同步的次数来控制是否完整同步之外,还可以通过完整同步的间隔时间来控制是否完整同步,至于具体的间隔时间也是用户根据实际情况进行设定,当然也可以通过两种方式同时来控制是否进行完整同步。比如可以设定实时同步的次数为5次那么在完成5次实时同步后,就会进行一次完整同步;比如可以设定完整间隔时间为2min,那么在每隔2min后进行一次完整同步。用户如果选定只通过实时同步次数来控制完整同步,那么只有每满5次实时同步后才会进行一次完整同步;用户如果选定只通过完整同步时间控制,那么只有每到2min后才会进行一次完整同步;用于如果选用两种方式来控制完整同步,那么在每到2min或者实时同步每满5次都会进行一次完整同步。
如图5所示,为了达到通过完整同步时间或者实时同步次数来控制完整同步的目的的流程如下:
创建任务线程时创建计时器线程、实时监控线程、实时同步线程和完整同步线程。计时器线程用于每间隔一段时间(设定值)定时通知完整同步线程执行一次完整同步。实时监控线程发送变动数据给实时同步线程(实时同步线程通过ReadDirectoryChanges方法进行实时同步),实时同步线程累积实时同步的次数,累积次数达到设定值后,通知完整同步线程执行一次完整同步。
如图3所示,完整同步线程在接到完整同步通知后,先通过FindFirstFile方法遍历查询和对比源路径文件,采用广度遍历方法用循环方式来减少递归方式带来的额外压栈出栈的开销,增加执行速度,每查询到一个文件都进行一次过滤,过滤掉用户不关心的文件,然后通过完美hash方法(即对文件名hash并将其hash值对指定值取模计算索引,然后用该索引找到对应的文件记录表进行存储查询),从文件记录表找到对应文件信息进行对比:
value = hash(filename);
num = value % n;
lastfileinfo = filelist[num].query(filename);
ret = curfileinfo.size != lastfileinfo.size
|| curfileinfo.fwritetime != lastfileinf.fwritetime;
如果文件发生变动,读写变动文件,执行文件同步(将变动信息放入变动文件表中,待遍历结束后,集中处理变动文件表里的变动信息,通过读写文件的方式,完完整整地将源文件复写到目标位置文件里)。待处理完后更新最新信息到文件记录表中(更新文件状态),记录当前完整同步结果。遇到占用、权限等问题导致同步文件失败时记录失败次数并还原其文件变动状态写到文件记录表中,待下次完整同步时再处理。
处理完变动文件表后,对于多次同步失败的变动文件,先对其源路径创建快照,再从快照中读取对应文件并同步到目标位置,同时更新文件信息到文件记录表中。

Claims (4)

1.一种基于Windows监控的实时同步的方法,其特征在于:通过ReadDirectoryChanges方法进行实时同步,每进行一次实时同步后,记录实时同步次数,当完整同步间隔时间达到设定值或者实时同步的次数达到设定值后进行完整同步,完成完整同步后又通过ReadDirectoryChanges方法进行实时同步,当完整同步间隔时间达到设定值或者实时同步的次数达到设定值后再进行完整同步,如此循环,直到结束;
每完成一次实时同步和完整同步后都建立一张文件记录表,用于记录当前同步后的所有文件信息;在实时同步开始时,优先加载文件记录表,对于首次执行任务先遍历文件创建原始的文件记录表,然后进行一次完整同步;
所述文件记录表通过内存映射文件保存在磁盘上;
所述通过ReadDirectoryChanges方法进行实时同步的具体流程为:
通过CreateIoCompletePort方法对源文件路径创建IO完成端口句柄,交由ReadDirectoryChanges建立对源路径文件监控,同时创建监控线程与消息处理线程,监控线程通过GetQueuedCompletionStatus方法获取完整端口状态,抓取文件变动信息,放入消息队列里;消息处理线程则从消息队列里获取文件变动信息,针对不同的文件变动信息处理变动数据;处理完变动数据后发送变动数据到实时同步线程进行实时同步,同时,每处理完一次变动后,记录文件变动次数,满一定次数后通知完整同步线程执行一次完整同步,如此循环,直到结束;
所述完整同步的具体流程为:在接到完整同步通知后,先通过FindFirstFile方法遍历和对比文件,然后读写变动文件,执行文件同步,更新文件状态和记录当前完整同步结果。
2.根据权利要求1所述的一种基于Windows监控的实时同步的方法,其特征在于:
通过FindFirstFile方法遍历和对比文件具体流程为;采用广度遍历方法用循环方式来减少递归方式带来的额外压栈出栈的开销,增加执行速度,每查询到一个文件都进行一次过滤,过滤掉用户不关心的文件,然后通过完美hash方法,从文件记录表找到对应文件信息进行对比,如果文件发生变动,则将变动信息放入变动文件表中,待遍历结束后,集中处理变动文件表里的变动信息,通过读写文件的方式,完完整整地将源文件复写到目标位置文件里。
3.根据权利要求2所述的一种基于Windows监控的实时同步的方法,其特征在于:所述完美hash方法的具体流程为:先将记录了庞大文件信息的文件记录表拆分为多个链表,通过对关键字hash取值,再将获取的hash值取模计算索引就能找到对应的记录表进行查询。
4.根据权利要求1所述的一种基于Windows监控的实时同步的方法,其特征在于:在执行文件同步失败时,记录失败次数并还原其文件变动状态写到文件记录表中,待下次完整同步时再处理,对于多次同步失败的变动文件,先对其源路径创建快照,再从快照中读取对应文件并同步到目标位置,同时更新文件信息到文件记录表中。
CN201810613906.9A 2018-06-14 2018-06-14 一种基于Windows监控的实时同步的方法 Active CN108874999B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810613906.9A CN108874999B (zh) 2018-06-14 2018-06-14 一种基于Windows监控的实时同步的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810613906.9A CN108874999B (zh) 2018-06-14 2018-06-14 一种基于Windows监控的实时同步的方法

Publications (2)

Publication Number Publication Date
CN108874999A CN108874999A (zh) 2018-11-23
CN108874999B true CN108874999B (zh) 2022-05-24

Family

ID=64338862

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810613906.9A Active CN108874999B (zh) 2018-06-14 2018-06-14 一种基于Windows监控的实时同步的方法

Country Status (1)

Country Link
CN (1) CN108874999B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111769933A (zh) * 2020-06-29 2020-10-13 北京天融信网络安全技术有限公司 一种监控文件变化方法、装置、电子设备及存储介质
CN112416869A (zh) * 2020-11-21 2021-02-26 广州西麦科技股份有限公司 Web应用集群环境存储文件的方法及系统
CN112416885B (zh) * 2020-12-09 2023-05-09 成都傲梅科技有限公司 一种文件的实时同步方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101833489A (zh) * 2010-05-06 2010-09-15 北京邮电大学 一种文件实时监控和智能备份的方法
CN102495880A (zh) * 2011-12-05 2012-06-13 北京新媒传信科技有限公司 一种文件同步的方法和装置
CN105740418A (zh) * 2016-01-29 2016-07-06 杭州亿方云网络科技有限公司 一种基于文件监控和消息推送的实时同步系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20170177613A1 (en) * 2015-12-22 2017-06-22 Egnyte, Inc. Event-Based User State Synchronization in a Cloud Storage System

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101833489A (zh) * 2010-05-06 2010-09-15 北京邮电大学 一种文件实时监控和智能备份的方法
CN102495880A (zh) * 2011-12-05 2012-06-13 北京新媒传信科技有限公司 一种文件同步的方法和装置
CN105740418A (zh) * 2016-01-29 2016-07-06 杭州亿方云网络科技有限公司 一种基于文件监控和消息推送的实时同步系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于RSYNC远程同步系统的优化;任燕博 等;《计算机与数字工程》;20140620;第42卷(第6期);第1007-1010页 *

Also Published As

Publication number Publication date
CN108874999A (zh) 2018-11-23

Similar Documents

Publication Publication Date Title
US10628378B2 (en) Replication of snapshots and clones
US8924355B1 (en) Checkpoint restart
CN108874999B (zh) 一种基于Windows监控的实时同步的方法
US7953710B2 (en) Multi-master database synchronization without loss of convergence
US8725695B2 (en) Storage system and object management method
US8260749B2 (en) Traversing data in a repeatable manner
US8442951B1 (en) Processing archive content based on hierarchical classification levels
EP3692442A1 (en) Partial database restoration
US20080065663A1 (en) Reestablishing process context
US11615000B2 (en) Method and backup server for processing expired backups
US11960363B2 (en) Write optimized, distributed, scalable indexing store
US20080065637A1 (en) Locating last processed data
US20230394010A1 (en) File system metadata deduplication
US8271454B2 (en) Circular log amnesia detection
US20230142613A1 (en) Recovering infected snapshots in a snapshot chain
CN110858168A (zh) 集群节点故障处理方法、装置及集群节点
US20230251934A1 (en) Snapshot range filters
CN106354830B (zh) 一种数据库集群节点间数据同步的方法及装置
CN110109934B (zh) 一种数据库管理方法、装置、服务器及存储介质
CN112416885A (zh) 一种文件的实时同步方法
US11645167B2 (en) Centralized retention and backup deletions
US11481287B2 (en) Using a stream of source system storage changes to update a continuous data protection-enabled hot standby
US20230177158A1 (en) Recovering quarantined information from backup locations
US11934274B2 (en) Efficient mechanism to perform auto retention locking of files ingested via distributed segment processing in deduplication backup servers
US10860429B1 (en) Centralized retention and backup deletions

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant