当前位置:网站首页>C# FileSystemWatcher 实时监控文件的增加、修改、重命名和删除实例
C# FileSystemWatcher 实时监控文件的增加、修改、重命名和删除实例
2022-08-08 06:29:00 【xgh815】
好多时候,我们都需要知道某些目录下的文件什么时候被修改、删除过等,如果能用miniFilter驱动过滤来做的话当然是最好不过了,这是内核级别的,当然也比较复杂。如果只是简单的记录就没必要用驱动过滤级别的来做了,用FileSystemWatcher来做就要简单得多。
FileSystemWatcher组件可以监视文件系统,并在文件系统发生改变时作出反应。FileSystemWatcher 常用于文件系统变更的监控,当被监视的文件夹目录被创建、修改、重命名或删除时,会触发以下事件:
- Created: 当新建文件或者文件夹
- Changed:当文件或者文件夹已经完成修改
- Renamed:当文件或者文件夹完成重命名
- Deleted:当文件或者文件夹被删除
- Error:当变更过程发生错误
下面我们一起来完成一个文件监控实例。
一、实例化FileSystemWatcher类,并注册监听事件
//创建一个FileSystemWatcher,并设置其属性
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
//设置监控的路径
fileSystemWatcher.Path = “监控路径”;
//是否监控指定路径中的子目录
fileSystemWatcher.IncludeSubdirectories = true;
//启用
fileSystemWatcher.EnableRaisingEvents = true;
//注册监听事件,Created、Changed、Deleted三个事件传递的参数是一样的,我们就用同一个方法来处理就可以了
fileSystemWatcher.Changed += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Created += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Deleted += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Renamed += new RenamedEventHandler(FileSystemWatcher_Renamed);
fileSystemWatcher.Error += new ErrorEventHandler(FileSystemWatcher_Error);
二、事件处理
FileSystemEventArgs 对象成员有:Name、OldName、ChangeType、FullPath、OldFullPath等,看名就明白是什么了,这里不做过多解释。
//创建一个FileSystemWatcher,并设置其属性
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
//设置监控的路径
fileSystemWatcher.Path = “监控路径”;
//是否监控指定路径中的子目录
fileSystemWatcher.IncludeSubdirectories = true;
//启用
fileSystemWatcher.EnableRaisingEvents = true;
//Created、Changed、Deleted三个事件的处理方法
private static void FileSystemWatcher_EventHandler(object sender, FileSystemEventArgs e)
{
Invoke(new Action(new Action(() =>
{
Console.WriteLine(e.Name+e.FullPath);
})));
}
//重命名事件的处理方法
private void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
{
Invoke(new Action(new Action(() =>
{
Console.WriteLine(e.OldName+e.Name+e.FullPath);
})));
}
//错误事件的处理方法
private void FileSystemWatcher_Error(object sender, ErrorEventArgs e)
{
Invoke(new Action(new Action(() =>
{
Console.WriteLine(e.ToString()));
})));
}
这里需要注意一个问题:因为FileSystemWatcher类本身就是一个多线程的控件,在实例化一个FileSystemWatcher时就自动创建了一个线程,在事件处理的方法中需要使用委托的方式封送到主线程中处理。
//声明传递文件Created、Changed、Deleted对象和委托,用于文件增加、删除、修改时更新UI界面
private delegate void setLogDelegate(FileSystemEventArgs e);
三、展示监控记录
监控的记录可以保存到文件和数据库中,这里就增加一个listView来展示就好了
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FileWatcher
{
public partial class Form1 : Form
{
private delegate void renameDelegate(RenamedEventArgs e); //声明传递RenamedEventArgs对象和委托,用于文件Renamed时更新UI界面
private delegate void setLogDelegate(FileSystemEventArgs e); //声明传递文件Created、Changed、Deleted对象和委托,用于文件增加、删除、修改时更新UI界面
private FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
private ColumnHeader chTime = new ColumnHeader();
private ColumnHeader chEvent = new ColumnHeader();
private ColumnHeader chFile = new ColumnHeader();
private ColumnHeader chPath = new ColumnHeader();
public Form1()
{
InitializeComponent();
chTime.TextAlign = HorizontalAlignment.Center;
chTime.Width = 130;
chTime.Text = "时间";
this.listViewInfo.Columns.Add(chTime);
chEvent.TextAlign = HorizontalAlignment.Center;
chEvent.Width = 80;
chEvent.Text = "事件";
this.listViewInfo.Columns.Add(chEvent);
chFile.Width = 270;
chFile.Text = "文件";
this.listViewInfo.Columns.Add(chFile);
chPath.Width = this.listViewInfo.Width - chTime.Width - chEvent.Width - chFile.Width - 21;
chPath.Text = "位置";
this.listViewInfo.Columns.Add(chPath);
ColumnHeader chEnd = new ColumnHeader();
chEnd.Width = 17;
chEnd.Text = "";
this.listViewInfo.Columns.Add(chEnd);
this.listViewInfo.View = View.Details;
this.listViewInfo.GridLines = true;
fileSystemWatcher.Changed += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Created += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Deleted += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Renamed += new RenamedEventHandler(FileSystemWatcher_Renamed);
fileSystemWatcher.Error += new ErrorEventHandler(FileSystemWatcher_Error);
fileSystemWatcher.IncludeSubdirectories = true;
fileSystemWatcher.EnableRaisingEvents = true;
}
#region 文件增加、删除、修改时被调用的处理方法
private void FileSystemWatcher_EventHandler(object sender, FileSystemEventArgs e)
{
if (listViewInfo.InvokeRequired) //判断是否跨线程
{
listViewInfo.Invoke(new setLogDelegate(SetLog), new object[] { e });//使用委托将方法封送到UI主线程处理
}
}
private void SetLog(FileSystemEventArgs e)
{
string strLog = "";
switch (e.ChangeType.ToString())
{
case "Created":
strLog = "文件创建";
break;
case "Changed":
strLog = "文件修改";
break;
case "Deleted":
strLog = "文件删除";
break;
default:
strLog = e.ChangeType.ToString();
break;
}
ListViewItem lvi = new ListViewItem();
lvi.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
lvi.SubItems.Add(strLog);
lvi.SubItems.Add(e.Name);
lvi.SubItems.Add(e.FullPath.Replace(e.Name,""));
listViewInfo.Items.Add(lvi);
}
#endregion
#region 重命名方法
private void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
{
if (listViewInfo.InvokeRequired)
{
listViewInfo.Invoke(new renameDelegate(SetRenamedLog), new object[]{e});
}
}
private void SetRenamedLog(RenamedEventArgs e)
{
//listViewInfo.Items.Add(string.Format("重命名:{0} 被换名为:{1}, {2}", e.OldName, e.Name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
ListViewItem lvi = new ListViewItem();
lvi.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
lvi.SubItems.Add("文件重命名");
lvi.SubItems.Add(e.OldName + "被换名为:" + e.Name);
lvi.SubItems.Add(e.FullPath.Replace(e.Name, ""));
listViewInfo.Items.Add(lvi);
}
#endregion
#region 错误事件的方法
private void FileSystemWatcher_Error(object sender, ErrorEventArgs e)
{
if (listViewInfo.InvokeRequired) //判断是否跨线程
{
//使用委托处理
Invoke(new Action(new Action(() =>
{
listViewInfo.Items.Add(string.Format("文件出错:{0}, {1}", e.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
})));
}
}
#endregion
}
}
边栏推荐
- 栈-实现一个简单的静态栈
- DCNN-4mC: Densely connected neural network basedN4-methylcytosine site prediction in multiple speci
- MySQL获取指定日期为所在月份的第几周
- 封装,property伪类属性,多态,反射
- 动手学数理统计(2)
- 使用websocket实现服务端主动发送消息到客户端
- 排列组合题目小结
- Deep-4mCGP:一种使用基于相关性的特征选择技术预测pickeringii地杆菌中4mC位点的深度学习方法
- 多数之和小结
- 论文解读:《Mouse4mC-BGRU:用于预测小鼠基因组中DNA N4-甲基胞嘧啶位点的深度学习》
猜你喜欢
随机推荐
封装,property伪类属性,多态,反射
【Android安全】Binder解析
论文翻译:《Phosvardeep:使用序列信息对磷酸变化的深度学习预测》
DAY5-深度学习100例-卷积神经网络(CNN)天气识别
基于FTP协议的文件上传与下载
Day37------网络
背包问题小结
数据链路层------基于TCP/IP五层模型
【数据序列化】扁平结构与嵌套结构
网络开发相关
Task01:PyTorch模型定义
从不同角度分析几种IO类型
网络安全笔记第三天day3(kali2021系统的安装)
网络安全笔记第一天day1
蓝牙5.2新特性 LE Audio - Isochronous channel
物联网安全-消息认证码
By using the fgets () the number of rows in the statistics file and use the fgets ()/fputs () copy files
minikube与kubectl版本不一致问题
Golang 简单的读负载均衡
Kubernetes | 02.搭建Kubernetes集群