用FileSystemWatcher监视文件变动

 前沿:前不久在逛网的时候下到一个SyncPlicity软件,是一种支持多文件夹的免费网络同步工具。简单的说就是安装此软件后您可以指定一个或多个监视目录,当这些目录中的文件发生改变后(重命名,删除,移动,创建)他会将改动的内容传给远端服务器。这样你在异地只要安装了这个软件,便可以从远端服务器上同步到这些变动的文件,同时异地上的任何操作又将同样的传递到本地。

        于是来了兴趣:grin: 打算模拟一下如何去监视指定的目录的变动。

        1、通过Timer来间隔检测文件夹中的变动,主要是对最后时间进行判断。?

        2、能否基于系统提供的Api或类库来实现监视
        显然,对于第一种方案是很不科学,也很不好把控的。如果用timer那么将会占用过多的资源,同时对于变动不能很明确的定位,在过深层级下的文件变动通过这种方式将很难遍历到,即便能够遍历到则其中的遍历也会增加系统的复杂度。然而在Net提供的类中有一个System.IO.FileSystemWatcher 通过命名就可以看出其功效——监视者。于是按照自己的思路进行Demo的编写。

 

 

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5 using  System.IO;
 6 namespace  FileWatch
 7 ExpandedBlockStart.gifContractedBlock.gif {
 8    class Program
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
10        static void Main(string[] args)
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            //用于输入需要监听的路径 例如 c:\
13            string s = Console.ReadLine();
14new FileWatchClass(s);
15            Console.ReadKey();
16        }

17    }

18
19    class FileWatchClass
20ExpandedSubBlockStart.gifContractedSubBlock.gif    {
21        System.IO.FileSystemWatcher FileWatcher = new FileSystemWatcher ();
22        public FileWatchClass(string WatcherPath)
23ExpandedSubBlockStart.gifContractedSubBlock.gif        {
24            FileWatcher.Filter = "*.*"//设定监听的文件类型
25            FileWatcher.Path = WatcherPath; //设定监听的目录
26            FileWatcher.Changed += new FileSystemEventHandler(FileWatcher_Changed); //Changed 事件处理
27            FileWatcher.Renamed += new RenamedEventHandler(FileWatcher_Renamed);//Renamed事件处理
28            FileWatcher.Created += new FileSystemEventHandler(FileWatcher_Created);//Created事件处理
29            FileWatcher.Deleted += new FileSystemEventHandler(FileWatcher_Deleted);//Deleted事件处理
30            FileWatcher.IncludeSubdirectories = true;//设置监听子目录
31            FileWatcher.EnableRaisingEvents = true;//开始进行监听(其实此处是标示是否进行事件监听和抛出)
32        }

33
34        void FileWatcher_Deleted(object sender, FileSystemEventArgs e)
35ExpandedSubBlockStart.gifContractedSubBlock.gif        {
36            Console.WriteLine(""+e.ChangeType+""+e.FullPath+" 删除 ");
37        }

38
39        void FileWatcher_Created(object sender, FileSystemEventArgs e)
40ExpandedSubBlockStart.gifContractedSubBlock.gif        {
41            Console.WriteLine("" + e.ChangeType + "" + e.FullPath + " 被创建 ");
42        }

43
44        void FileWatcher_Renamed(object sender, RenamedEventArgs e)
45ExpandedSubBlockStart.gifContractedSubBlock.gif        {
46            Console.WriteLine("" + e.ChangeType + "" + e.OldFullPath + " 由原来名 " + e.OldName + " 改名为 " + e.Name);
47        }

48
49        void FileWatcher_Changed(object sender, FileSystemEventArgs e)
50ExpandedSubBlockStart.gifContractedSubBlock.gif        {
51            Console.WriteLine("" + e.ChangeType + "" + e.FullPath + " 发生改变 ");
52        }

53    }

54}

55
56

 

编译这个Demo,我们来进行测试一下。原来本打算只是实现功能,当测试时突然发现了系统在处理文件时的一些小信息:

1、同级目录内复制文件(Test.txt) 结果为(捕获到 一次创建,两次改变):

【Created】c:\复制Test.txt  被创建
【Changed】c:\复制Test.txt  发生改变
【Changed】c:\复制Test.txt  发生改变

2、非同级目录复制(Test.txt 复制到 Test文件夹下面)  结果为(捕获到 一次创建,两次改变+一次文件夹改变):

【Created】c:\Test\Test.txt  被创建
【Changed】c:\Test\Test.txt  发生改变
【Changed】c:\Test\Test.txt  发生改变
【Changed】c:\Test  发生改变

3、非同级的剪切 粘贴(Test.txt 剪切到 Test 文件夹下)结果为(捕获到 一次删除  一次创建 一次文件夹改变):

【Deleted】c:\Test.txt  删除
【Created】c:\Test\Test.txt  被创建
【Changed】c:\Test  发生改变

 

可以看出一个小问题,对于未建立的文件,在创建时在创建后会出现两次Changed,然而对于已经存在的文件移动在另一个目的地时没有那“多余”的两次Changed 这是为什么呢??

转载于:https://www.cnblogs.com/foxhunter/archive/2009/06/25/FileSystemWatcher.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值