**********************************************************************************

第一个文章:

**********************************************************************************

概述

最近学习FileSystemWatcher的用法,它主要是监控一个文件夹,当文件夹内的文件要是有更改就要记录下来,我就整理下我对FileSystemWatcher 的理解和用法.

FileSystemWatcher 用法

在应用FileSystemWatcher对象之前,你必须了解这个对象的一些基本属性和事件。毫无疑问,这个对象的最重要的属性为“EnableRaisingEvents”属性。

这个属性决定对象在收到改变通知时是否提交事件。如果EnableRaisingEvents属性设为假,对象将不会提交改变事件。如果设为真,它将提交改变事件。下面是你在应用FileSystemWatcher对象时将要用到的其它一些重要属性/事件:

属性:

Path——这个属性告诉FileSystemWatcher它需要监控哪条路径。例如,如果我们将这个属性设为“C:Temp”,对象就监控那个目录发生的所有改变。 
IncludeSubDirectories——这个属性说明FileSystemWatcher对象是否应该监控子目录中发生的改变。 
Filter——这个属性允许你过滤掉某些类型的文件发生的变化。例如,如果我们只希望在TXT文件被修改/新建/删除时提交通知,可以将这个属性设为“*txt”。在处理高流量或大型目录时,使用这个属性非常方便。 
事件

Changed——当被监控的目录中有一个文件被修改时,就提交这个事件。值得注意的是,这个事件可能会被提交多次,即使文件的内容仅仅发生一项改变。这是由于在保存文件时,文件的其它属性也发生了改变。 
Created——当被监控的目录新建一个文件时,就提交这个事件。如果你计划用这个事件移动新建的事件,你必须在事件处理器中写入一些错误处理代码,它能处理当前文件被其它进程使用的情况。之所以要这样做,是因为Created事件可能在建立文件的进程释放文件之前就被提交。如果你没有准备正确处理这种情况的代码,就可能出现异常。 
Deleted——当被监控的目录中有一个文件被删除,就提交这个事件。 
Renamed——当被监控的目录中有一个文件被重命名,就提交这个事件。 
注:如果你没有将EnableRaisingEvents设为真,系统不会提交任何一个事件。如果有时FileSystemWatcher对象似乎无法工作,请首先检查EnableRaisingEvents,确保它被设为真。

事件处理

当FileSystemWatcher调用一个事件处理器时,它包含两个自变量——一个叫做“sender”的对象和一个叫做“e”的FileSystemEventArgs对象。我们感兴趣的自变量为FileSystemEventArgs自变量。这个对象中包含有提交事件的原因。以下是FileSystemEventArgs对象的一些属性:

属性:

Name——这个属性中使事件被提交的文件的名称。其中并不包含文件的路径——只包含使用事件被提交的文件或目录名称。 
ChangeType——这是一个WatcherChangeTypes,它指出要提交哪个类型的事件。其有效值包括:Changed、Created、Deleted、Renamed 
FullPath——这个属性中包含使事件被提交的文件的完整路径,包括文件名和目录名。

FileSystemWatcher对象为你完成目录监控工作。如果新建、更新或删除一个文件,FileSystemWatcher将提交一个事件,通知你发生了一项改变。这样,新建一个文件后,你的程序立即就知道可以使用这个文件。立即通知改变使得你的系统以更高的效率工作,因为你不能总是“调查”目录中发生的改变,而且在两次目录扫描之间也不会有时间流失。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Program
   {
       static void Main(string[] args)
       {
           WatcherStrat(@"D:\spring\Program", "*.*");
           Console.ReadKey();
       }
       private static void WatcherStrat(string path, string filter)
       {
           FileSystemWatcher watcher = new FileSystemWatcher();
           watcher.Path = path;
           watcher.Filter = filter;
           watcher.Changed += new FileSystemEventHandler(OnProcess);
           watcher.Created += new FileSystemEventHandler(OnProcess);
           watcher.Deleted += new FileSystemEventHandler(OnProcess);
           watcher.Renamed += new RenamedEventHandler(OnRenamed);
           watcher.EnableRaisingEvents = true;
           watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess
                                  | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
           watcher.IncludeSubdirectories = true;
       }
       private static void OnProcess(object source, FileSystemEventArgs e)
       {
           if (e.ChangeType == WatcherChangeTypes.Created)
           {
               OnCreated(source, e);
           }
           else if (e.ChangeType == WatcherChangeTypes.Changed)
           {
               OnChanged(source, e);
           }
           else if (e.ChangeType == WatcherChangeTypes.Deleted)
           {
               OnDeleted(source, e);
           }
       }
       private static void OnCreated(object source, FileSystemEventArgs e)
       {
           Console.WriteLine("文件新建事件处理逻辑 {0}  {1}  {2}", e.ChangeType, e.FullPath, e.Name);
       }
       private static void OnChanged(object source, FileSystemEventArgs e)
       {
           Console.WriteLine("文件改变事件处理逻辑{0}  {1}  {2}", e.ChangeType, e.FullPath, e.Name);
       }
        
       private static void OnDeleted(object source, FileSystemEventArgs e)
       {
           Console.WriteLine("文件删除事件处理逻辑{0}  {1}   {2}", e.ChangeType, e.FullPath, e.Name);
       }
        
       private static void OnRenamed(object source, RenamedEventArgs e)
       {
           Console.WriteLine("文件重命名事件处理逻辑{0}  {1}  {2}", e.ChangeType, e.FullPath, e.Name);
       }
   }

运行结果

总结

1、重命名会触发两个事件,Renamed和Changed。

2、FileSystemWatcher对NTFS和FAT32的磁盘监控的效果都是一样吗?

**********************************************************************************

第二个文章:

**********************************************************************************

当需要监控某一文件,FileSystemWatcher类提供了Created, Deleted,Rename等事件。

就拿FileSystemWatcher的Created事件来说,该事件类型是FileSystemEventHandler。

复制代码代码如下:
public delgate void FileSystemEventHandler(Object sender, FileSystemEventArgs e)

其中参数:
sender表示事件的发起者
e表示事件参数

在C盘创建temp文件夹。

客户端。

复制代码代码如下:
class Program
{
        static void Main(string[] args)
        {
            var watcher = new FileSystemWatcher(@"c:\temp");
            watcher.EnableRaisingEvents = true; //启用FileSystemWatcher
            watcher.Created += new FileSystemEventHandler(OnCreated);
            watcher.Deleted += new FileSystemEventHandler(OnDeleted);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);
            Console.ReadKey();
        }
        static void OnDeleted(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0}:{1}", e.ChangeType, e.Name);
        }
        static void OnCreated(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0}:{1}", e.ChangeType, e.Name);
        }
        static void OnRenamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("{0}:原文件名{1},新文件名{2}", e.ChangeType, e.OldName, e.Name);
        }
}

当然,可以通过 watcher.Renamed += OnCreated;注册事件。

希望本文所述对大家的C#程序设计有所帮助。

*************************************************************************

转载于:https://www.cnblogs.com/wanzhongjun/p/6626256.html

C# FileSystemWatcher 在监控文件夹和文件时的用法相关推荐

  1. 监控WIN2003文件服务器上的文件夹和文件的复制、删除

    监控WIN2003文件服务器上的文件夹和文件的复制.删除.比如是哪个域用户复制了或是哪个域用户删除了文件和文件夹.目的:文件服务器里的公共文件夹缺少访问行为监控,误删或故意删除可能会造成数据丢失.文件 ...

  2. matlab读取一个文件的图片大小,Matlab读取文件夹中子文件夹中的图片并修改尺寸...

    今天被师兄问到如何利用matlab批处理图片,觉得很简单嘛 就让他去百度 结果只百度到处理文件夹中图片的程序 好吧 这里放上如何处理文件夹中子文件夹的图片 现状:在一个名为casia的文件夹中,里面有 ...

  3. Java循环读取文件夹下文件

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; public class ...

  4. Linux的文件夹及文件的权限

    Linux的文件夹及文件的权限 使用ls -l命令可显示当前目录下所包含的文件及文件的属性和权限 [username@localhost ~]$ ls -l total 32 drwxr-xr-x. ...

  5. python 遍历文件夹和文件

    文件结构如下图 path = r"文件夹1" 遍历1层下的所有文件名和文件夹名 import os fileList = os.listdir(path) # 遍历1层 print ...

  6. java读取hdfs文件夹_HDFS 读取、写入、遍历文件夹获取文件全路径、append

    1.从HDFS中读取数据 Configuration conf = getConf(); Path path = new Path(pathstr); FileSystem fs = FileSyst ...

  7. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  8. C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件

    大家可以到http://www.icsharpcode.net/opensource/sharpziplib/ 下载SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, ...

  9. C#中判断文件夹或文件是否存在的方法

    c#中操作IO非常简单,下面介绍如何判断文件夹或文件是否存在的方法.  代码如下:  //判断文件夹是否存在,不存在则创建文件夹  if (!System.IO.Directory.Exists(@& ...

最新文章

  1. R语言绘制火山图(volcano plot)实战:为差异表达基因(DEGs)添加颜色、基于显著性阈值进行点的颜色美化、为选定基因添加标签
  2. mysql免压缩安装教程_MySql免解压版安装教程
  3. session 对象的简单实例
  4. 机器学习算法一览(附python和R代码)
  5. table 多行 宽度不一致_layui table 中固定列的行高和table行高不一致
  6. 关于Spring MVC 中地址栏访问 /WEB-INF下的.jsp
  7. C++vector容器
  8. tomcat运行模式(bio,aio,apr)
  9. CSS:transform
  10. 你还记得它吗?Visual FoxPro,红极一时的狐狸头
  11. win10运行C语言的程序,win10运行游戏时出现程序无法正常启动0xc0000142解决方法介绍...
  12. Hello Qt(十六)——QT绘图实例-钟表
  13. 【197期】华为OD两轮技术面试记录,给后来人一个参考!
  14. ipad iphone开发_如何通过Chromecast观看iPhone / iPad视频?
  15. 队列的顺序、链式表示与实现
  16. SLCP验厂辅导,发布网关是SLCP系统中用于数据托管和共享的关键角色
  17. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Oops在Linux 2.6内核+PowerPC架构下的前世今生
  18. 走进GBase 8s之高可用功能(二)HAC灾备高可用
  19. html的星星评分效果,利用jQuery实现星星打分评分插件
  20. 适用于Mac的免费数据恢复软件推荐

热门文章

  1. github上传本地代码
  2. regex 正则表达式_使用正则表达式(Regex)删除HTML标签
  3. 机器学习特征构建_使用Streamlit构建您的基础机器学习Web应用
  4. pcb中layer stack manager 中,右上角的layer pairs 、internal layer pairs和build-up,三者的区别?
  5. 一道3G门户的面试题 (Java)
  6. oracle进程内存不足1046552,ora-04030 进程内存不足解决方案
  7. python爬取歌曲评论_python 爬取歌曲评论的简单示例
  8. 链表的数据域怎么使用结构体_一步一步教你从零开始写C语言链表
  9. 计算机数媒专业优势,27所院校新开设数字媒体艺术专业,“数媒”专业为什么这么火?...
  10. 打开方式中选择默认方式无反映_「Windows」得看,更改文件的默认应用,告别“打开方式”...