C#文件监控
给大家分享一下个人对C#文件监控FileSystemWatcher类的理解和看法。
要学习C#中如何对文件或者文件夹进行监控,只需要了解这个类就可以对文件进行各种增、删、改操作进行监控,他们各自对应了不同的事件。
首先要认识一下FileSystemWatcher类的重要属性:
- Path:设置你要监控的文件夹路径,注意只能是文件夹哦
- IncludeSubdirectories:是否要监控目标文件夹的子文件夹,是一个Boolean类型。
- Filter:这个属性很灵活,你可以设置一个文件名(带后缀),那么就只监控这个文件,你也可以设置一个后缀如:*.txt,它就监控所有txt格式的文件,这个属性很好用,但坑爹的是他只能设置一个值,你不能对他设置两个后缀名的监控。
- NotifyFilter:这个属性很重要,它是设置监控的类型,是一枚举类型(NotifyFilters),默认值为 LastWrite、 FileName 和 DirectoryName 一般设为默认就满足大多数需求,下面是这个枚举每个值所对应的效果:
NotifyFilters.Attributes:监控对文件的任何修改(修改内容,名称,属性[只读、隐藏、存档])
NotifyFilters.CreationTime:仅监控创建日期的修改
NotifyFilters.DirectoryName:监控对文件夹的添加、修改名称、删除,不包括对文件夹属性的更改
NotifyFilters.FileName:监控对文件的添加、删除、修改名称
NotifyFilters.LastAccess:仅监控对文件或目录上一次打开日期的修改
NotifyFilters.LastWrite:仅监控对文件内容的修改
NotifyFilters.Security:仅监控对文件或文件夹安全设置的更改
NotifyFilters.Size:监控文件或文件夹大小的改变(文件内容的改变也会触发)
如果要设置多个值格式如下:new FileSystemWatcher().NotifyFilter=NotifyFilters.Attributes|NotifyFilters.CreationTime; - EnableRaisingEvents:设置是否启用监控的Boolean,如果设置成False那么,你的监控事件一个都不会触发。
了解了这些基本的属性大家看一下下面的代码示例基本都了然了:
1 using System; 2 using System.Collections.Generic; 3 using System.Collections; 4 using System.Linq; 5 using System.Text; 6 using System.IO; 7 8 namespace File_Monitoring 9 { 10 /// <summary> 11 /// 文件监控 12 /// </summary> 13 class Program 14 { 15 static void Main(string[] args) 16 { 17 FileSystemWatcher watcher = new FileSystemWatcher(); 18 19 //设置监控路径 20 watcher.Path = "C:\\test";//注意此盘必须存在 21 22 //NotifyFilters.Attributes:影响对文件的任何修改(修改内容,名称,属性[只读、隐藏、存档]) 23 //NotifyFilters.CreationTime:仅影响创建日期的修改 24 //NotifyFilters.DirectoryName:影响对文件夹的添加、修改名称、删除,不包括对文件夹属性的更改 25 //NotifyFilters.FileName:影响对文件的添加、删除、修改名称 26 //NotifyFilters.LastAccess:仅影响对文件或目录上一次打开日期的修改 27 //NotifyFilters.LastWrite:仅影响对文件内容的修改 28 //NotifyFilters.Security:仅影响对文件或文件夹安全设置的更改 29 //NotifyFilters.Size:影响文件或文件夹大小的改变(文件内容的改变也会触发) 30 31 32 watcher.NotifyFilter = NotifyFilters.FileName|NotifyFilters.LastWrite|NotifyFilters.DirectoryName; 33 34 //设置监控子目录 35 watcher.IncludeSubdirectories = true; 36 37 //设置监控对象类型(只能一种) 38 watcher.Filter = "*"; 39 40 //启用监控 41 watcher.EnableRaisingEvents = true; 42 43 //新建事件 44 watcher.Created += new FileSystemEventHandler(watcher_Created); 45 //更改事件 46 watcher.Changed += new FileSystemEventHandler(watcher_Changed); 47 //重命名事件 48 watcher.Renamed += new RenamedEventHandler(watcher_Renamed); 49 //删除事件 50 watcher.Deleted += new FileSystemEventHandler(watcher_Deleted); 51 //因为是控制台应用程序所以我让线程休眠一会儿观看效果 52 System.Threading.Thread.Sleep(30000); 53 } 54 55 static void watcher_Deleted(object sender, FileSystemEventArgs e) 56 { 57 Console.WriteLine("删除"); 58 } 59 60 static void watcher_Renamed(object sender, RenamedEventArgs e) 61 { 62 Console.WriteLine("更改名称"); 63 } 64 65 static void watcher_Changed(object sender, FileSystemEventArgs e) 66 { 67 Console.WriteLine("更改"); 68 } 69 70 static void watcher_Created(object sender, FileSystemEventArgs e) 71 { 72 Console.WriteLine("创建"); 73 } 74 75 } 76 }
上面的代码如果大家想看效果可以修改监控文件夹路径,然后新建一个控制台应用程序,覆盖Program这个类代码运行,你的操作信息将输出到控制台。
好了基本用法就介绍到这里,最后在说明一下,由于文件夹的监控对内存消耗比较大,你可以对InternalBufferSize属性设置缓冲区大小,还可以通过
IncludeSubdirectories、NotifyFilter、Filter这三个属性来控制监控范围,从而减少对内存的消耗。