FileSystemWatcher监视文件变动

模拟一下如何去监视指定的目录的变动。

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

        2、能否基于系统提供的Api或类库来实现监视
        显然,对于第一种方案是很不科学,也很不好把控的。如果用timer那么将会占用过多的资源,同时对于变动不能很明确的定位,在过深层级下的文件变动通过这种方式将很难遍历到,即便能够遍历到则其中的遍历也会增加系统的复杂度。

         然而在Net提供的类中有一个System.IO.FileSystemWatcher 通过命名就可以看出其功效——监视者。于是按照自己的思路进行Demo的编写。

 

 

  using  System;
  using  System.Collections.Generic;
  using  System.Linq;
  using  System.Text;
  using  System.IO;
  namespace  FileWatch
  {
      class  Program
        {
         static   void  Main( string [] args)
         {
             // 用于输入需要监听的路径 例如 c:\
             string  s  =  Console.ReadLine();
            new  FileWatchClass(s);
            Console.ReadKey();
        }
    }

     class  FileWatchClass
     {
        System.IO.FileSystemWatcher FileWatcher  =   new  FileSystemWatcher ();
         public  FileWatchClass( string  WatcherPath)
         {
            FileWatcher.Filter  =   " *.* " // 设定监听的文件类型
            FileWatcher.Path  =  WatcherPath;  // 设定监听的目录
            FileWatcher.Changed  +=   new  FileSystemEventHandler(FileWatcher_Changed);  // Changed 事件处理
            FileWatcher.Renamed  +=   new  RenamedEventHandler(FileWatcher_Renamed); // Renamed事件处理
            FileWatcher.Created  +=   new  FileSystemEventHandler(FileWatcher_Created); // Created事件处理
            FileWatcher.Deleted  +=   new  FileSystemEventHandler(FileWatcher_Deleted); // Deleted事件处理
            FileWatcher.IncludeSubdirectories  =   true ; // 设置监听子目录
            FileWatcher.EnableRaisingEvents  =   true ; // 开始进行监听(其实此处是标示是否进行事件监听和抛出)
        }

        void  FileWatcher_Deleted( object  sender, FileSystemEventArgs e)
         {
            Console.WriteLine( " " + e.ChangeType + " " + e.FullPath + "  删除  " );
        }

         void  FileWatcher_Created( object  sender, FileSystemEventArgs e)
         {
            Console.WriteLine( " "   +  e.ChangeType  +   " "   +  e.FullPath  +   "  被创建  " );
        }

         void  FileWatcher_Renamed( object  sender, RenamedEventArgs e)
         {
            Console.WriteLine( " "   +  e.ChangeType  +   " "   +  e.OldFullPath  +   "  由原来名  "   +  e.OldName  +   "  改名为  "   +  e.Name);
        }

         void  FileWatcher_Changed( object  sender, FileSystemEventArgs e)
         {
            Console.WriteLine( " "   +  e.ChangeType  +   " "   +  e.FullPath  +   "  发生改变  " );
        }
    }
}

 

编译这个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/northstar/archive/2010/04/08/FileSystemWatcher.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值