好多时候,我们都需要知道某些目录下的文件什么时候被修改、删除过等,如果能用miniFilter驱动过滤来做的话当然是最好不过了,这是内核级别的,当然也比较复杂。如果只是简单的记录就没必要用驱动过滤级别的来做了,用FileSystemWatcher来做就要简单得多。

FileSystemWatcher组件可以监视文件系统,并在文件系统发生改变时作出反应。FileSystemWatcher 常用于文件系统变更的监控,当被监视的文件夹目录被创建、修改、重命名或删除时,会触发以下事件:

  1. Created: 当新建文件或者文件夹
  2. Changed:当文件或者文件夹已经完成修改
  3. Renamed:当文件或者文件夹完成重命名
  4. Deleted:当文件或者文件夹被删除
  5. 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 实时监控文件的增加、修改、重命名和删除实例相关推荐

  1. C# FileSystemWatcher 多文件夹、多文件类型文件监控增加、修改、重命名和删除实例

    在上一次讲过了FileSystemWatcher 实时监控文件的增加.修改.重命名和删除,具体怎么实现就不再去阐述,参考如下文 C# FileSystemWatcher 实时监控文件的增加.修改.重命 ...

  2. python输入文件名读取文件_[Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等...

    1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...

  3. linux下使用inotify实时监控文件变更,做完整性检查

    完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: A.定期检测,例如通过cron或程序内置计时器 B.实时检测 ...

  4. java jnotify_java JNotify (基于内核)实时监控文件

    JNotify 下载地址 jnotify(包含dll与so).rar win 将dll文件放入  jdk bin目录下 linux 将so文件放入  jdk bin目录下 maven增加JNotify ...

  5. python实时监控文件目录_c#教程之c#使用filesystemwatcher实时监控文件目录的

    /// /// 文件监控类,用于监控指定目录下文件以及文件夹的变化 /// public class FileWatcher { private FileSystemWatcher _watcher ...

  6. inotifywait监听php,inotifywait 是一个可以实时监控文件变动的工具

    inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ~]# uname -r 2.6.32-22 ...

  7. linux监控覆盖视频恢复,linux下使用inotify实时监控文件变更,做完整性检查

    linux下使用inotify实时监控文件变更,做完整性检查 完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: ...

  8. python实时监控文件大小_python实现实时监控文件的方法

    在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和 ...

  9. python实时监控文件目录_教你三种方法,用 Python实时监控文件

    原标题:教你三种方法,用 Python实时监控文件 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决 ...

最新文章

  1. Python 进阶_生成器 生成器表达式
  2. eclipse环境下配置tomcat服务器
  3. Trigger4Orchard
  4. Oracle 简单树查询
  5. HighCharts解析之xAxis——x轴的样式
  6. encode函数php,utf8_encode()与utf8_decode函数_PHP教程
  7. 如何排查 Kubernetes 的内存增长问题?
  8. 转盘抽奖的案例-----
  9. ArcGIS 10.3 AddIN编译旧版本项目问题
  10. Modbus RTU/ASCll+TCP+OPC电脑模拟+串口调试软件对接方案
  11. 新北京交通限行时间、尾号查询
  12. 国外浏览器无法访问apple ID页面,显示502 Bad Gateway,解决方法
  13. 国家标准的台式计算机,GBT 9813.1-2016 计算机通用规范 第1部分:台式微型计算机国家标准...
  14. 给table表格表头添加斜线
  15. 小米手机夜间模式在哪设置?仅需2个步骤
  16. Taq DNA聚合酶的种类与应用现状
  17. matlab tic和toc单位,Matlab中tic和toc用法
  18. python制作查询网页_Python制作简单的网页爬虫
  19. 关于时间复杂度什么是时间复杂度
  20. MySQL安装--无法初始化

热门文章

  1. Android 插件化原理----Hook机制之动态代理
  2. 目标检测YOLO实战应用案例100讲-智能目标检测系统在FPGA中的设计与实现
  3. Android 原生省电模式
  4. SharedPreferences获取时报空指针异常,以及普通类中使用SharedPreferences存储数据
  5. 淘个宝贝,淘气过六一
  6. 自学前端,达到什么水平能找工作?
  7. 计算机二级准考证打印不了 解决办法在这里
  8. Java 集合 add 方法重复添加问题
  9. linux vim 配置文件在哪,linux系统常用 VIM配置文件
  10. Linux系统修复网络,解决Linux系统故障排查和修复技巧的3种方法解析与案例分享...