文件夹双向同步 FileSystemWacther应用

      最近做了一个文件夹同步的练习小程序,使用FileSystemWatcher实现两个文件夹的双向同步。实际上并没有实现真正的双向同步,因为不能保证同时操作文件对象时也能同步。程序思路很简单,就是监视文件系统的操作事件,并根据操作类型,在另一个文件夹中执行相同的操作。文件的更改,直接使用Copy过去。这里不研究文件同步算法,也没这水平。要有兴趣可以看下这位大牛的blog:点这里

     首先必须能够监听文件系统的操作,这是最麻烦的一件事,还好.net 为我们提供了FileSystemWatcher 类。FileSystemWatcher 类“侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件”,不忽略隐藏文件。

详细请看MSDN上的类说明:FileSystemWatcher.

    要特别注意此类的几个属性:

    Filter:获取或设置筛选字符串,用于确定在目录中监视哪些文件。可以是一种类型"*.txt"或其他,但不可以是几种,例如不能实现同时监视.txt和.doc,但可以监视所有,用“*.*”。

    NotifyFilter:获取或设置要监视的更改类型。可组合 NotifyFilters 枚举的成员,以同时监视多种类型的更改。减少监视类型可以有效提高FileSystemWatcher缓冲区的利用。

   IncludeSubdirectories:获取或设置一个值,该值指示是否监视指定路径中的子目录。当为 true 时,IncludeSubdirectories 递归通过整个子树,而不仅仅是直接子目录。

   InternalBufferSize:获取或设置内部缓冲区的大小(以字节为单位)。 默认值为 8192 (8 KB),最小4K,最大64K,为了获得最佳性能,在基于Intel的机子上使用4K的倍数。

系统通知组件文件发生更改,并将这些更改存储在组件创建并传递给 API 的缓冲区中。 每个事件最多可以使用 16 字节的内存,不包括文件名。 如果短时间内有很多更改,则缓冲区可能会溢出。 这将导致组件失去对目录更改的跟踪,并且它将只提供一般性通知。 增加缓冲区的大小可以防止丢失文件系统更改事件。 但是,增加缓冲区大小的开销较大,因为它来自无法换出到磁盘的非分页内存,所以将缓冲区保持得越小越好。 若要避免缓冲区溢出,请使用 NotifyFilter IncludeSubdirectories 属性筛选掉不想要的更改通知。

 

程序不应该在事件中处理过多的内容,比如说文件的读写、线程锁等,因为长时间的处理,在大文件量操作时可能导致FileSystemWatcher缓冲区溢出,从而导致同步失败!

我之前就有过这样的情形,在拷贝目录比较深,文件量大,七八千个吧,就导致监视事件丢失,同步文件失败!后改为记录操作事件到队列,不对记录队列做线程安全处理,不给它加锁之类的,然后再使用其他线程根据队列进行操作。具体实现就看程序吧,代码写的不好勿喷。

项目用VS2010 建的。FileSynceConsole.zip

 

posted @ 2012-07-10 16:54  枯木欣荣  阅读(1246)  评论(0编辑  收藏  举报