一、场景
有时候,我们需要监控文件夹的变化,然后做出一些业务处理,这里面,最典型的例子,估计前端攻城狮老熟的,就是各种打包了。
那么在C#后端,也会遇到要监控变化的情况,像网盘等。
二、C#中的文件监控
可以用钩子函数来处理,这种会处理得让你抓狂,一可能是太多消息事件,你头都大,二估计你不是C/C++的程序员,对win32函数本身就不熟,找资料都要你老费劲了。
那么C#中的文件监控还有什么办法呢?C#庞大的类库中,提供了FileSystemWatcher类,该类可以专门用于文件夹监控,下面是该类的api定义:
三、FileSystemWatcher的功能
FileSystemWatcher可以根据您设定的文件夹进行监控,动作覆盖创建、删除、改动、重命名等。另外还可以动态地定义需要监控的文件类型,比如您只想监控rar文件、txt文件,又或者您想同时监控多种文件都可以。
四、FileSystemWatcher常用属性
- Path:要监视的文件夹路径。这是文件夹(也叫目录)路径,不是具体的某一个文件的路径,无法对单个具体文件监控。
- Filter:筛选监控的文件类型,指该文件夹下的某种类型的文件,比如*.txt、*.rar、*.html文件。
- NotifyFilter:监视什么动作类型。本属性是位域,允许进行位运算的。比如可以监视修改、目录名、文件名更改、修改时间等。
- IncludeSubdirectories:是否监控子文件夹。即级联监控。
- EnableRaisingEvents:是否启动本组件。这个新手很容易出问题的地方,本属性等于是个开关。新手以为FileSystemWatcher创建一个新对象new一下,就可以使用了,不是的,new了对象之后,要记得把本属性设置为true,才是真正开始用。
五、FileSystemWatcher常用事件
- Created:当创建文件夹,或者创建文件时,触发
- Changed:更新文件夹或者文件时触发
- Renamed:重命名文件夹或者文件时触发
- Deleted:删除文件夹或者文件时触发
六、简单示例
上图是代码截图,源码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
FileSystemWatcher watcher = new FileSystemWatcher(@"E:\test\");
watcher.IncludeSubdirectories = true;
watcher.Deleted += Watcher_Deleted;
watcher.Created += Watcher_Created;
watcher.Renamed += Watcher_Renamed;
watcher.EnableRaisingEvents = true;
}
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
}
private static void Watcher_Deleted(object sender, FileSystemEventArgs e)
{
}
private static void Watcher_Created(object sender, FileSystemEventArgs e)
{
}
}
}
运行效果,当您在E:\test进行文件夹或者文件操作时,当进入事件。
祝您用餐愉快。