发明内容
有鉴于此,本发明的主要目的在于提供一种实现软件内外目录同步的方法和系统,以实现软件内外目录的快速同步,并节省系统资源。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种实现软件内外目录同步的方法,该方法包括:
在计算机启动软件时,开启一个轮询线程和至少一个实时监控线程;
所述轮询线程按照预定的扫描速度对待扫描文件夹列表中的文件夹进行扫描,当发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对所述软件内部文件夹中的数据进行更新;所述轮询线程扫描过的文件夹被添加到已访问文件夹列表中;
所述实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知所述轮询线程对发生修改的文件夹进行扫描,并在发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对所述软件内部文件夹中的数据进行更新。
该方法进一步包括:
在计算机启动软件时,遍历所述计算机的所有磁盘分区,并为每个磁盘分区开启一个实时监控线程进行监控。
所述待扫描文件夹列表中包括:所述软件的文件夹树中被选中的文件夹及其子文件夹和对应通铺中的文件夹。
该方法进一步包括:
所述轮询线程对待扫描文件夹列表中的文件夹进行扫描之前,判断待扫描的文件夹是否存在于所述已访问文件夹列表中,如果存在,则不做扫描;如果不存在,则进行扫描。
所述实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知所述轮询线程对发生修改的文件夹进行扫描,具体包括以下操作:
步骤a、所述实时监控线程收到一条文件修改信息;
步骤b、尝试接收所述文件修改信息,并启动计时器;
步骤c、判断所述计时器超时前是否收到新的文件修改信息,如果收到,执行步骤d;否则,执行步骤e;
步骤d、判断所述新的文件修改信息与前一次接收的文件修改信息是否对应同一文件夹,如果是,执行步骤;否则,执行步骤e;
步骤e、通知所述轮询线程对发生修改的文件夹进行扫描;
步骤f、重置计时器并返回步骤b。
本发明还提供了一种实现软件内外目录同步的系统,该系统包括:
线程开启模块,用于在计算机启动软件时,开启一个轮询线程和至少一个实时监控线程;
轮询线程控制模块,用于控制所述轮询线程按照预定的扫描速度对待扫描文件夹列表中的文件夹进行扫描,当发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对所述软件内部文件夹中的数据进行更新;还用于将所述轮询线程扫描过的文件夹添加到已访问文件夹列表中;
实时监控线程控制模块,用于控制所述实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知所述轮询线程对发生修改的文件夹进行扫描;
列表维护模块,用于维护所述待扫描文件夹列表和已访问文件夹列表。
所述线程开启模块进一步用于,在计算机启动软件时,遍历所述计算机的所有磁盘分区,为每个磁盘分区开启一个实时监控线程进行监控。
所述待扫描文件夹列表中包括:所述软件的文件夹树中被选中的文件夹及其子文件夹和对应通铺中的文件夹。
所述轮询线程控制模块进一步用于,在控制所述轮询线程对待扫描文件夹列表中的文件夹进行扫描之前,判断待扫描的文件夹是否存在于所述已访问文件夹列表中,如果存在,则不做扫描;如果不存在,则进行扫描。
所述实时监控线程控制模块进一步用于,控制所述实时监控线程执行以下操作:
步骤a、所述实时监控线程收到一条文件修改信息;
步骤b、尝试接收所述文件修改信息,并启动计时器;
步骤c、判断所述计时器超时前是否收到新的文件修改信息,如果收到,执行步骤d;否则,执行步骤e;
步骤d、判断所述新的文件修改信息与前一次接收的文件修改信息是否对应同一文件夹,如果是,执行步骤f;否则,执行步骤e;
步骤e、通知所述轮询线程对发生修改的文件夹进行扫描;
步骤f、重置计时器并返回步骤b。
本发明所提供的一种实现软件内外目录同步的方法和系统,在计算机启动软件时,开启一个轮询线程和至少一个实时监控线程;轮询线程按照预定的扫描速度对待扫描文件夹列表中的文件夹进行扫描,当发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对软件内部文件夹中的数据进行更新;轮询线程扫描过的文件夹被添加到已访问文件夹列表中;实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知轮询线程对发生修改的文件夹进行扫描,并在发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对软件内部文件夹中的数据进行更新。
通过本发明,能够快速响应软件外部文件夹中对文件的增加、修改和删除操作,还能节省系统资源,不做不必要的扫描,不会在软件启动时进行大量扫描而造成性能瓶颈。
具体实施方式
下面结合附图和具体实施例对本发明的技术方案进一步详细阐述。
本发明所提供的一种实现软件内外目录同步的方法,如图2所示,在计算机启动软件时,开启一个轮询线程和至少一个实时监控线程(所述轮询线程和实时监控线程并行执行);轮询线程按照预定的扫描速度对待扫描文件夹列表中的文件夹进行扫描,当发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对软件内部文件夹中的数据进行更新;轮询线程扫描过的文件夹被添加到已访问文件夹列表中;实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知轮询线程对发生修改的文件夹进行扫描,并在发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对软件内部文件夹中的数据进行更新。
其中,在计算机启动软件时,可以遍历计算机的所有磁盘分区,并为每个磁盘分区开启一个实时监控线程进行监控。
轮询线程负责扫描待扫描文件夹列表中的文件夹内容的改变,下面结合图2对轮询线程的处理过程进行详细阐述。
轮询线程并不是轮询计算机上的所有文件夹,而是轮询待扫描文件夹列表中的文件夹,该列表即为图1所示的界面上(文件夹树和通铺)展示的文件夹,包括:文件夹树中被用户选中的文件夹及其子文件夹和对应通铺中的所有文件夹。例如:用户选中图1所示文件夹树中的文件夹boost_1_34_1,那么待扫描文件夹列表中的文件夹,即包括文件夹boost_1_34_1及其子文件夹,以及与boost_1_34_1及其子文件夹对应的通铺中的所有文件夹;轮询线程随即对上述文件夹列表中的文件夹进行扫描,该扫描是对计算机磁盘的相应文件夹的数据扫描,而不是对软件内部数据的扫描。由此可知,当文件夹树中选中的文件夹改变时,待扫描文件夹列表也随之改变。此外,由于计算机磁盘中的其他文件夹内容的改变不会对图1所示界面的展示造成影响,因此不做扫描。
另外,轮询线程不会重复扫描同一文件夹,除非实时监控线程通知轮询线程该文件夹的内容发生了改变;轮询线程扫描过的文件夹会被添加到已访问文件夹列表中,那么在下一次轮询时,如果发现待扫描的文件夹已经存在于已访问文件夹列表中,则不会对其进行扫描。相应的,轮询线程在对待扫描文件夹列表中的文件夹进行扫描之前,需要首先判断待扫描的文件夹是否存在于已访问文件夹列表中(即判断该文件夹是否已被扫描),如果存在,则不做扫描;如果不存在,则进行扫描。
较佳的,轮询线程的扫描速度可以控制在K个文件夹/5秒,即每5秒启动一次轮询过程,每次轮询过程遍历待扫描文件夹列表中的K个文件夹,而不是遍历待扫描文件夹列表中的所有文件夹;如果遍历的文件夹在已访问文件夹列表中,则不需要扫描。如此一来,可以控制每次轮询过程中扫描文件夹的数量,以保证一次轮询过程不会占用太多资源。也就是说,上述处理可以保证轮询线程所消耗的系统资源是极低的,并且不会影响扫描的效果。
需要说明的是,每次文件夹扫描过程,会遍历计算机磁盘中对应该文件夹下的所有文件和子文件夹,查看其存在性、可见性(即是否为隐藏文件)以及最后修改时间等相关数据,如果这些相关数据与软件内部文件夹中的数据存在差异,则依据所遍历文件夹的相关数据对软件内部文件夹中的数据进行更新。这样,即可准确获知文件的增加、修改和删除等操作,其中还包括可见性的修改。
另外,轮询线程会根据待扫描文件夹列表中的信息来更新扫描的文件夹。每次软件启动时,界面中显示上一次关闭时的视图,软件将上一次关闭时选中的文件夹、其一级子文件夹以及通铺内的所有文件夹放入待扫描文件夹列表中。
实时监控线程负责对计算机的各个磁盘中的文件夹内容的改变进行实施监控,下面结合图2对实时监控线程的处理过程进行详细阐述。
实时监控线程可以通过ReadDirectoryChangesW函数来实现对文件夹的实时监控,该ReadDirectoryChangesW函数是一个Windows API。通过该函数,实时监控线程可以快速获知外部对文件或文件夹的增加、修改和删除等操作。该函数可以通过同步和异步两种方式进行调用。
所谓同步调用,是指程序运行到该函数时,不再继续往下运行(阻塞),直到Windows系统发出一个文件修改信息;ReadDirectoryChangesW函数捕获该通知后,才继续往下运行程序。
所谓异步调用,是指程序运行到该函数时,立刻返回所有(也可能没有)未被捕获的文件修改信息,然后继续往下执行。此处,系统捕获文件修改信息和软件从系统获得文件修改信息的过程是异步的;所谓的未被捕获是从软件的角度来说的,而不是从系统的角度。文件修改信息的捕获示意图如图3所示,当文件发生修改时,系统生成一条文件修改信息,放入文件修改信息池,系统不断往池里放入文件修改信息,池里的信息称为未被捕获的文件修改信息;软件调用ReadDirectoryChangesW函数来捕获池中的信息,每次调用ReadDirectoryChangesW函数,池中的内容将被全部复制到软件内部的缓存中,被复制到软件内部缓存中的信息称为被捕获的。
在使用同步方式调用ReadDirectoryChangesW函数时,需要告知该函数要监控的文件夹和要监控的文件修改的类型,该类型如监控文件的属性(是否为隐藏文件等)变化、文件名的变化、文件的创建和文件夹名字的变化等等,然后调用的ReadDirectoryChangesW函数将阻塞。当ReadDirectoryChangesW函数返回时,能够得到以链表形式组织的一系列文件修改信息,通过遍历该链表,即能够获知哪些文件发生了怎样的修改。
需要说明的是,当某一个实时监控线程获取到一个文件修改信息时,并不会立即通知轮询线程扫描对应的文件夹,而是会经过一个排重的过程。因为用户很可能是在同一个文件夹做一次批量操作(比如批量删除)。这时,实时监控线程会依次捕获若干条同一文件夹下的文件修改信息。事实上,只需要在这些操作全部做完后,通知轮询线程对该文件夹进行一次扫描即可,而不必每次收到一条信息都通知轮询线程扫描一次,这样也可以提高效率,节省扫描所消耗的系统资源。
下面结合图4,对实时监控中的排重机制进行详细说明,主要包括以下步骤:
步骤401,实时监控线程收到一条文件修改信息。
步骤402,该实时监控线程尝试接收该文件修改信息,存储该文件修改信息所在的文件夹路径,并启动计时器n,n的取值可以为500毫秒。
步骤403,判断是否收到新的文件修改信息,如果收到,执行步骤405;否则,执行步骤404。
步骤404,判断计时是否结束,即计时器是否超时,如果是,执行步骤407;否则,返回步骤402。
步骤405,判断新的文件修改信息与前一次接收的文件修改信息是否对应同一文件夹,即判断新的文件修改信息的文件夹路径与前一次接收的文件修改信息的文件夹路径是否相同,如果是,执行步骤406;否则,执行步骤407。
步骤406,重置计时器n并返回步骤402。
步骤407,结束排重,通知轮询线程对发生修改的文件夹进行扫描。
实时监控线程检查改变的文件夹是否存在于已访问文件夹列表中,如果是,则从中删除;再检查改变的文件夹是否存在于待扫描文件夹列表中,如果是,则将该文件夹移到待扫描文件夹列表的头部等待扫描,如果不是,则添加该文件夹到待扫描文件夹列表的头部等待扫描。
例如:实时监控线程先收到一条文件修改信息1,存储其文件夹路径为文件夹A;在计时器n超时前又收到一条文件修改信息2,如果文件修改信息2的文件夹路径为文件夹B,则实时监控线程结束本次排重,通知轮询线程对文件夹A进行扫描;如果文件修改信息2的文件夹路径为文件夹A,则重置计时器n,并重新尝试新的接收文件修改信息(即返回上述步骤302继续执行后续操作)。依次类推,通过上述排重机制,能够提高轮询线程的扫描效率,节省轮询线程的扫描次数,从而节省扫描所消耗的系统资源。
本发明的上述实现软件内外目录同步的方法应用于图1所示的图像处理软件中,具体包括:
在计算机启动图像处理软件时,开启一个轮询线程和至少一个实时监控线程(所述轮询线程和实时监控线程并行执行);轮询线程按照预定的扫描速度对待扫描文件夹列表中的文件夹进行扫描,当发现扫描的文件夹与图像处理软件内部文件夹中的图片数据存在差异时,对图像处理软件内部文件夹中的图片数据进行更新;轮询线程扫描过的文件夹被添加到已访问文件夹列表中;实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知轮询线程对发生修改的文件夹进行扫描,并在发现扫描的文件夹与图像处理软件内部文件夹中的图片数据存在差异时,对软件内部文件夹中的图片数据进行更新。
其中,轮询线程并不是轮询计算机上的所有文件夹,而是轮询待扫描文件夹列表中的文件夹,该列表即为图1所示的界面上(文件夹树和通铺)展示的文件夹,包括:文件夹树中被用户选中的文件夹及其子文件夹和对应通铺中的所有文件夹。
实时监控线程可以通过ReadDirectoryChangesW函数来实现对文件夹的实时监控。另外,当某一个实时监控线程获取到一个文件修改信息时,并不会立即通知轮询线程扫描对应的文件夹,而是会经过一个图4所示的排重的过程,以提高效率,节省扫描所消耗的系统资源。
对应上述实现软件内外目录同步的方法,本发明还提供了一种实现软件内外目录同步的系统,如图5所示,该系统包括:线程开启模块10、轮询线程控制模块20、实时监控线程控制模块30和列表维护模块40。其中,线程开启模块10,用于在计算机启动软件时,开启一个轮询线程和至少一个实时监控线程。轮询线程控制模块20,连接线程开启模块10,用于控制轮询线程按照预定的扫描速度对待扫描文件夹列表中的文件夹进行扫描,当发现扫描的文件夹与软件内部文件夹中的数据存在差异时,对软件内部文件夹中的数据进行更新;还用于将轮询线程扫描过的文件夹添加到已访问文件夹列表中。实时监控线程控制模块30,连接线程开启模块10,用于控制实时监控线程对计算机的磁盘进行实时监控,在获取到文件修改信息时,通知轮询线程对发生修改的文件夹进行扫描。列表维护模块40,连接轮询线程控制模块20和实时监控线程控制模块30,用于维护待扫描文件夹列表和已访问文件夹列表。
较佳的,线程开启模块10还可用于,在计算机启动软件时,遍历计算机的所有磁盘分区,为每个磁盘分区开启一个实时监控线程进行监控。
较佳的,轮询线程控制模块20还可用于,在控制轮询线程对待扫描文件夹列表中的文件夹进行扫描之前,判断待扫描的文件夹是否存在于已访问文件夹列表中,如果存在,则不做扫描;如果不存在,则进行扫描。
较佳的,实时监控线程控制模块30还可用于,控制实时监控线程执行以下操作:
步骤a、实时监控线程收到一条文件修改信息;
步骤b、尝试接收文件修改信息,并启动计时器;
步骤c、判断计时器超时前是否收到新的文件修改信息,如果收到,执行步骤d;否则,执行步骤e;
步骤d、判断新的文件修改信息与前一次接收的文件修改信息是否对应同一文件夹,如果是,执行步骤f;否则,执行步骤e;
步骤e、通知轮询线程对发生修改的文件夹进行扫描;
步骤f、重置计时器并返回步骤b。
综上所述,本发明通过结合轮询和实时监控这两种机制,不仅能够快速响应软件外部文件夹中对文件的增加、修改和删除操作,而且还能节省系统资源,不做不必要的扫描,不会在软件启动时进行大量扫描而造成性能瓶颈。此外,本发明不仅适用于图像处理工具,也适用于其他需要实现软件内外目录同步的文件处理工具。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。