C# FileSystemWatcher 实时监控文件的增加、修改、重命名和删除实例
好多时候,我们都需要知道某些目录下的文件什么时候被修改、删除过等,如果能用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}
}
完整例子下载
C# FileSystemWatcher 实时监控文件的增加、修改、重命名和删除实例相关推荐
- C# FileSystemWatcher 多文件夹、多文件类型文件监控增加、修改、重命名和删除实例
在上一次讲过了FileSystemWatcher 实时监控文件的增加.修改.重命名和删除,具体怎么实现就不再去阐述,参考如下文 C# FileSystemWatcher 实时监控文件的增加.修改.重命 ...
- python输入文件名读取文件_[Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等...
1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...
- linux下使用inotify实时监控文件变更,做完整性检查
完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: A.定期检测,例如通过cron或程序内置计时器 B.实时检测 ...
- java jnotify_java JNotify (基于内核)实时监控文件
JNotify 下载地址 jnotify(包含dll与so).rar win 将dll文件放入 jdk bin目录下 linux 将so文件放入 jdk bin目录下 maven增加JNotify ...
- python实时监控文件目录_c#教程之c#使用filesystemwatcher实时监控文件目录的
/// /// 文件监控类,用于监控指定目录下文件以及文件夹的变化 /// public class FileWatcher { private FileSystemWatcher _watcher ...
- inotifywait监听php,inotifywait 是一个可以实时监控文件变动的工具
inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ~]# uname -r 2.6.32-22 ...
- linux监控覆盖视频恢复,linux下使用inotify实时监控文件变更,做完整性检查
linux下使用inotify实时监控文件变更,做完整性检查 完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: ...
- python实时监控文件大小_python实现实时监控文件的方法
在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和 ...
- python实时监控文件目录_教你三种方法,用 Python实时监控文件
原标题:教你三种方法,用 Python实时监控文件 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决 ...
最新文章
- Python 进阶_生成器 生成器表达式
- eclipse环境下配置tomcat服务器
- Trigger4Orchard
- Oracle 简单树查询
- HighCharts解析之xAxis——x轴的样式
- encode函数php,utf8_encode()与utf8_decode函数_PHP教程
- 如何排查 Kubernetes 的内存增长问题?
- 转盘抽奖的案例-----
- ArcGIS 10.3 AddIN编译旧版本项目问题
- Modbus RTU/ASCll+TCP+OPC电脑模拟+串口调试软件对接方案
- 新北京交通限行时间、尾号查询
- 国外浏览器无法访问apple ID页面,显示502 Bad Gateway,解决方法
- 国家标准的台式计算机,GBT 9813.1-2016 计算机通用规范 第1部分:台式微型计算机国家标准...
- 给table表格表头添加斜线
- 小米手机夜间模式在哪设置?仅需2个步骤
- Taq DNA聚合酶的种类与应用现状
- matlab tic和toc单位,Matlab中tic和toc用法
- python制作查询网页_Python制作简单的网页爬虫
- 关于时间复杂度什么是时间复杂度
- MySQL安装--无法初始化
热门文章
- Android 插件化原理----Hook机制之动态代理
- 目标检测YOLO实战应用案例100讲-智能目标检测系统在FPGA中的设计与实现
- Android 原生省电模式
- SharedPreferences获取时报空指针异常,以及普通类中使用SharedPreferences存储数据
- 淘个宝贝,淘气过六一
- 自学前端,达到什么水平能找工作?
- 计算机二级准考证打印不了 解决办法在这里
- Java 集合 add 方法重复添加问题
- linux vim 配置文件在哪,linux系统常用 VIM配置文件
- Linux系统修复网络,解决Linux系统故障排查和修复技巧的3种方法解析与案例分享...