论文部分内容阅读
摘要:所谓的文件夹同步,也叫实时备份,就是保持目标文件夹中的文件随时和源文件中的文件完全一致。要实现同步,程序就必须随时知道源文件夹中的文件是否发生了变化。那么该功能是如何实现的呢?本文给出了实现的方法(API函数)和原理,同时用一个C++ Builder中的实例来证明问题。
关键词:文件夹同步;备份;C++ Builder;监控;进程;函数
中图分类号:TP311.1文献标识码:A文章编号:1009-3044(2007)05-11302-01
1编程思路
对于文件夹同步功能不同的软件采取不同的实现方法。一些软件采用定时备份的策略来避开这个难题,不管源文件是否已经变化,只有到了指定的时间间隔,才检查源文件夹和目标文件夹是否一致,而比较专业的软件则能够在源文件夹发生任何变化时马上截获这种变化并采取措施使目标文件夹中的文件更新。显然,后一种方法更可靠。那么,当源文件夹中的文件发生变化时,程序如何才能马上知道呢?用定时器当然是不可能的。下面,就将在C++ Builder的实现方法介绍如下:
很多人都知道如何实现在一个进程结束前一直等待的方法。因为Windows是一个多任务系统,所以如果我们在程序中创造一个进程并执行,那么不论进程是否执行完毕,我们的程序都会马上返回。典型的例子就是我们在程序中通过WinExc()函数执行一个Dos程序,即使这个Dos程序还在运行,我们的程序也会继续执行下面的语句。还可以找到的例子就是批处理文件执行的效果。如果想要让程序等到外部进程结束才继续运行,就要用Wait For Sing Object()函数循环监视进程的执行情况,直到发现进程已经结束再退出循环,继续下面的语句。而监视文件夹是否发生变化的原理也是采用了这种方法。系统会为我们创造进程,只有当文件夹发生变化时这个进程才能退出,只有里程退出,我们的程序才继续运行,并调用同步文件夹的自定义函数Tong Bu(),然后,再继续循环监视这个进程……
不同的是,这个进程不是由我们创建并招待的,而是系统创建并招待的。要创建这个进程,就必须调用API函数Find First Change Notification()以及Find Next Change Notification()。事实上,当我们调用第一个API函数,系统就会创建一个进程并返回在这个进程的句柄,这个进程在不停的运行,直到指定的文件夹发生变化时才退出。而我们就可以通过循环调用Wait For Single Object()函数监视这个进程是否退出(进程退出后这个函数返回),从而知道文件夹是否已经发生变化。
当文件夹发生变化,这个系统创建的过程就会退出,这时调用Tong Bu()函数检查源文件夹已经变化的文件并更新目标文件夹。然后,当然必须继续监视文件夹的变化,而系统刚刚创建的进程已经退出,我们必须再次让系统创建这个进程。这时有两个选择:一个就是再次调用Find First Change Notification()函数,重新创建进程对指定的文件夹进行监视。另一个就是调用函数Find Next Change Notification()函数,直接创建进程对上次那个文件夹进行监视。如果使用第一种方法的话,必须首先关闭上一次创建进程进行的监视,调用函数Find First Change Notification()即可。所以从简单性考虑,还是使用第二方法。不过,无论哪种方法,在不需要监视时都必须调用函数Find Close Change Notification()关闭监视。
这样可以在一个循环中不停地创建进程、监视进程、变化后同步、再次创建进程、监视进程、变化后同步……但是一定要设置条件可以退出循环,比如一个逻辑变量指示,否则该软件就会“死路一条”!而且,循环中一定要将系统及当前窗体的消息传出去。否则,系统除了运行这个软件,什么也干不了啦,可以使用Application→Process Messages()将消息传出去。
2 示例程序
下面是一个简单的文件夹同步的示例程序。这个程序在文件夹同步函数Tong Bu()中,简单地将源文件夹中所有的文件拷贝到目标文件夹中覆盖目标文件,并不是很好的解决方案,实际上应该检测源文件夹与目标文件夹不同的文件,只拷贝这些文件即可,但这是一个示例程序(注:以下程序在C++ Builder中调试通过)。
本程序在主窗体Form1中包含两组Group Box,每组包含一个Drive Com box和一个Directory List Box,分别用来指定源文件夹和目标文件夹,另外还有两个File List Box用来显示源文件夹和目标文件夹中的文件列表。上面这些组件通过相应的属性设置联系在一起,使改变驱动器时文件夹自动变化,根本不用编写一行代码,这就是C++ Builder让我们着迷的地方,当然具体的设置方法我就不再赘述了。
至于两个按钮,Bit Btn1和Bit Btn2的作用是:Bit Btn2是用来退出的,而Bit Btn1则是用来开始和停止文件夹变化监控的。如果正在监控,那么单击一下就停止监控,否则单击一下就开始监控。我们用一个逻辑变量Start Flag标识目前的监控状态。
各个API函数在源代码中说明其用法。下面的源代码为了节省篇幅,省略了自动生成的部分。
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
参考文献:
[1]谢敏.应用C++ Builder实现实时数据采集、显示的方法[J].电子工程师.(32,1).
[2]茜西.文件夹同步好帮手JFileSyn[J].计算机文摘. 2005,(8).
[3]朱时银.C++ Builder5.0编程实例与技巧[M].北京:机械工业出版社,2001.
[4]张晓东. C++ Builder5程序设计[M].北京:中国铁道出版社,2002.
[5](美)Ken Getz Mike Gilbert.VBA高级开发指南[M].北京:电子工业出版社,1997.
[6]刘森林.一种基于C++ Builder的过程控制系统设计与实现[J].东南大学学报,2003,9(33):158-161.
关键词:文件夹同步;备份;C++ Builder;监控;进程;函数
中图分类号:TP311.1文献标识码:A文章编号:1009-3044(2007)05-11302-01
1编程思路
对于文件夹同步功能不同的软件采取不同的实现方法。一些软件采用定时备份的策略来避开这个难题,不管源文件是否已经变化,只有到了指定的时间间隔,才检查源文件夹和目标文件夹是否一致,而比较专业的软件则能够在源文件夹发生任何变化时马上截获这种变化并采取措施使目标文件夹中的文件更新。显然,后一种方法更可靠。那么,当源文件夹中的文件发生变化时,程序如何才能马上知道呢?用定时器当然是不可能的。下面,就将在C++ Builder的实现方法介绍如下:
很多人都知道如何实现在一个进程结束前一直等待的方法。因为Windows是一个多任务系统,所以如果我们在程序中创造一个进程并执行,那么不论进程是否执行完毕,我们的程序都会马上返回。典型的例子就是我们在程序中通过WinExc()函数执行一个Dos程序,即使这个Dos程序还在运行,我们的程序也会继续执行下面的语句。还可以找到的例子就是批处理文件执行的效果。如果想要让程序等到外部进程结束才继续运行,就要用Wait For Sing Object()函数循环监视进程的执行情况,直到发现进程已经结束再退出循环,继续下面的语句。而监视文件夹是否发生变化的原理也是采用了这种方法。系统会为我们创造进程,只有当文件夹发生变化时这个进程才能退出,只有里程退出,我们的程序才继续运行,并调用同步文件夹的自定义函数Tong Bu(),然后,再继续循环监视这个进程……
不同的是,这个进程不是由我们创建并招待的,而是系统创建并招待的。要创建这个进程,就必须调用API函数Find First Change Notification()以及Find Next Change Notification()。事实上,当我们调用第一个API函数,系统就会创建一个进程并返回在这个进程的句柄,这个进程在不停的运行,直到指定的文件夹发生变化时才退出。而我们就可以通过循环调用Wait For Single Object()函数监视这个进程是否退出(进程退出后这个函数返回),从而知道文件夹是否已经发生变化。
当文件夹发生变化,这个系统创建的过程就会退出,这时调用Tong Bu()函数检查源文件夹已经变化的文件并更新目标文件夹。然后,当然必须继续监视文件夹的变化,而系统刚刚创建的进程已经退出,我们必须再次让系统创建这个进程。这时有两个选择:一个就是再次调用Find First Change Notification()函数,重新创建进程对指定的文件夹进行监视。另一个就是调用函数Find Next Change Notification()函数,直接创建进程对上次那个文件夹进行监视。如果使用第一种方法的话,必须首先关闭上一次创建进程进行的监视,调用函数Find First Change Notification()即可。所以从简单性考虑,还是使用第二方法。不过,无论哪种方法,在不需要监视时都必须调用函数Find Close Change Notification()关闭监视。
这样可以在一个循环中不停地创建进程、监视进程、变化后同步、再次创建进程、监视进程、变化后同步……但是一定要设置条件可以退出循环,比如一个逻辑变量指示,否则该软件就会“死路一条”!而且,循环中一定要将系统及当前窗体的消息传出去。否则,系统除了运行这个软件,什么也干不了啦,可以使用Application→Process Messages()将消息传出去。
2 示例程序
下面是一个简单的文件夹同步的示例程序。这个程序在文件夹同步函数Tong Bu()中,简单地将源文件夹中所有的文件拷贝到目标文件夹中覆盖目标文件,并不是很好的解决方案,实际上应该检测源文件夹与目标文件夹不同的文件,只拷贝这些文件即可,但这是一个示例程序(注:以下程序在C++ Builder中调试通过)。
本程序在主窗体Form1中包含两组Group Box,每组包含一个Drive Com box和一个Directory List Box,分别用来指定源文件夹和目标文件夹,另外还有两个File List Box用来显示源文件夹和目标文件夹中的文件列表。上面这些组件通过相应的属性设置联系在一起,使改变驱动器时文件夹自动变化,根本不用编写一行代码,这就是C++ Builder让我们着迷的地方,当然具体的设置方法我就不再赘述了。
至于两个按钮,Bit Btn1和Bit Btn2的作用是:Bit Btn2是用来退出的,而Bit Btn1则是用来开始和停止文件夹变化监控的。如果正在监控,那么单击一下就停止监控,否则单击一下就开始监控。我们用一个逻辑变量Start Flag标识目前的监控状态。
各个API函数在源代码中说明其用法。下面的源代码为了节省篇幅,省略了自动生成的部分。
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
参考文献:
[1]谢敏.应用C++ Builder实现实时数据采集、显示的方法[J].电子工程师.(32,1).
[2]茜西.文件夹同步好帮手JFileSyn[J].计算机文摘. 2005,(8).
[3]朱时银.C++ Builder5.0编程实例与技巧[M].北京:机械工业出版社,2001.
[4]张晓东. C++ Builder5程序设计[M].北京:中国铁道出版社,2002.
[5](美)Ken Getz Mike Gilbert.VBA高级开发指南[M].北京:电子工业出版社,1997.
[6]刘森林.一种基于C++ Builder的过程控制系统设计与实现[J].东南大学学报,2003,9(33):158-161.