C#利用FileSystemWatcher实时监控文件的增加,修改,重命名和删除

目录
  • 一、实例化FileSystemWatcher类,并注册监听事件
  • 二、事件处理
  • 三、展示监控记录

好多时候,我们都需要知道某些目录下的文件什么时候被修改、删除过等,如果能用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实时监控文件的增加,修改,重命名和删除的详细内容,更多关于C# FileSystemWatcher监控文件的资料请关注我们其它相关文章!

(0)

相关推荐

  • c#实现数据同步的方法(使用文件监控对象filesystemwatcher)

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务器做别的操作,而那个文本的写入有时候会频繁,1秒可能多次,但是也有可能在相当长一段时间内是没有任何写入的. 这样一来如果每秒都去访问文件的话,一个是IO问题,还有就是每次操作都会引起后端一系列程序的反应,文本在长时间内无写入的话,一秒一次的触发一系列徒劳的事情太不可取了. 最终发现了c#中的File

  • c#使用filesystemwatcher实时监控文件目录的添加和删除

    首先,我们需要对.net提供的FileSystemWatcher类有所了解.我有些懒,找了MSDN对该类的描述. FileSystemWatcher类侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件. 使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录的更改.可以创建一个组件来监视本地计算机.网络驱动器或远程计算机上的文件. 若要监视所有文件中的更改,请将 Filter 属性设置为空字符串 ("") 或使用通配符("*

  • C#中FileSystemWatcher的使用教程

    开局一张图,在 System.IO 下的 FileSystemWatcher 常用于监视文件系统的变更,当文件系统中的文件或者文件夹被修改会自动触发相应的回调事件. 为了能够了解 FileSystemWatcher 是怎么运作的,你可以指定一个被监视的文件夹,当被监视的文件夹修改后,大概会触发如下的一些事件. Changed: 当文件或者文件夹已经完成修改时触发此事件 Created:当文件或者文件夹已经成功创建触发此事件 Deleted:当文件或者文件夹已经成功删除触发此事件 Error:当变

  • c#使用filesystemwatcher监视文件系统的变化

    复制代码 代码如下: #region 监视文件夹的变化            FileSystemWatcher watcher = new FileSystemWatcher();            watcher.Path = "f:\\";            watcher.NotifyFilter =//被监控的方面               NotifyFilters.LastWrite |               NotifyFilters.FileName

  • C# FileSystemWatcher 在监控文件夹和文件时的使用方法

    概述 最近学习FileSystemWatcher的用法,它主要是监控一个文件夹,当文件夹内的文件要是有更改就要记录下来,我就整理下我对FileSystemWatcher 的理解和用法. FileSystemWatcher 用法 在应用FileSystemWatcher对象之前,你必须了解这个对象的一些基本属性和事件.毫无疑问,这个对象的最重要的属性为"EnableRaisingEvents"属性. 这个属性决定对象在收到改变通知时是否提交事件.如果EnableRaisingEvents

  • C#采用FileSystemWatcher实现监视磁盘文件变更的方法

    本文实例讲述了C#采用FileSystemWatcher实现监视磁盘文件变更的方法.分享给大家供大家参考.具体实现方法如下: 简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数据库. 原需求:原先的需求是这样的:有一台PDA扫码枪,一个IP照相机放置在下线区传送带上方.当PDA扫描箱子上的条码,触发相机拍照,将图片流传至远端服务器,找到对应的条码,将图片存储并更新数据库. 然而我不知道PDA扫描的瞬间如何与

  • C#的FileSystemWatcher用法实例详解

    本文实例详述了C#的FileSystemWatcher用法.分享给大家供大家参考.具体用法如下: FileSystemWatcher控件主要功能: 监控指定文件或目录的文件的创建.删除.改动.重命名等活动.可以动态地定义需要监控的文件类型及文件属性改动的类型. 1.常用的几个基本属性: (1) Path :设置要监视的目录的路径. (2) IncludeSubdirectories :设置是否级联监视指定路径中的子目录. (3) Filter :设置筛选字符串,用于确定在目录中监视哪些类型的文件

  • C#使用FileSystemWatcher控件实现的文件监控功能示例

    本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视文件系统,并对文件系统的改变作出反应.通过使用FileSystemWatcher组件,在特定的文件或目录被创建.修改或删除时,可以快速和便捷地启动业务流程. 例如,如果一组用户在合作处理一个存储在服务器共享目录下的文档时,可以使用FileSystemWatcher组件编写应用程序来监视对共享目录的更

  • C#利用FileSystemWatcher实时监控文件的增加,修改,重命名和删除

    目录 一.实例化FileSystemWatcher类,并注册监听事件 二.事件处理 三.展示监控记录 好多时候,我们都需要知道某些目录下的文件什么时候被修改.删除过等,如果能用miniFilter驱动过滤来做的话当然是最好不过了,这是内核级别的,当然也比较复杂.如果只是简单的记录就没必要用驱动过滤级别的来做了,用FileSystemWatcher来做就要简单得多. FileSystemWatcher组件可以监视文件系统,并在文件系统发生改变时作出反应.FileSystemWatcher 常用于文

  • python实现实时监控文件的方法

    在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和$upstream_response_time时间,分析出最耗时的请求,然后去改进代码,这时就要对日志进行实时分析了,发现时间长的语句就要报警出来,提醒开发人员要关注,当然这是其中一个应用场景,通过这种监控方式还可以应用到任何需要判断或分析文件的地方,所以今天我们就来看看如何用python实现实时监

  • Python利用watchdog模块监控文件变化

    目录 1.准备 2.基本使用 3.监控文件变化 假设现在有一个应用场景,需要对文件系统进行监控,发生变化时产生日志,对新增的文件做一些相应的操作. 比如说应用到我们之前的音乐高潮提取器:若当前文件夹下增加了一个音乐文件,监控器就调用音乐高潮提取器,自动提取该音乐文件的高潮部分. 这样的监控器写起来也不难,但是很花时间,有许多情况要考虑.不过幸好我们是写Python的,有许多轮子可以使用,本文介绍的就是一个名为 watchdog 的模块,它能帮助我们实现上述功能. 1.准备 开始之前,你要确保Py

  • java.nio.file.WatchService 实时监控文件变化的示例代码

    目录 1.示例代码 2.其实并没有实时 在平时的开发过程中,会有很多场景需要实时监听文件的变化,如下:1.通过实时监控 mysql 的 binlog 日志实现数据同步2.修改配置文件后,希望系统可以实时感知3.应用系统将日志写入文件中,日志监控系统可以实时抓取日志,分析日志内容并进行报警4.类似 ide 工具,可以实时感知管理的工程下的文件变更 在 Java 语言中,从 JDK7 开始,新增了java.nio.file.WatchService类,用来实时监控文件的变化. 1.示例代码 File

  • Perl 文本文件的读写操作、文件的重命名和删除、多个文本文件的合并实现代码

    读文件: 复制代码 代码如下: #!perlopen filetxt,"/path/a.txt";   #  filetxt为文件句柄,用于和文件a.txt建立链接.文件句柄可任意取名,但不要和Perl自带的几个文件句柄重名.print <filetxt>;                 #  此处print函数用于显示文件a.txt的内容.<>为取行操作符,<文件句柄>用于读取所链接文件的内容.close filetxt;            

  • PHP实现读取文件夹及批量重命名文件操作示例

    本文实例讲述了PHP实现读取文件夹及批量重命名文件操作.分享给大家供大家参考,具体如下: 以读取从网上下载的评书解压后的文件夹为例,并批量重命名 文件夹内容如下,现在使用php读取这个文件夹里面的文件,并批量重命名为"隋唐演义+序号.mp3"的格式: <?php $dir1 = './dir1/';//读取文件夹名称 (重命名为dir1避免中文报错,移动到与要执行的php文件同级目录) $filearr = scandir($dir1);//读取文件夹 print_r($file

  • java实时监控文件行尾内容的实现

    今天讲一下怎样用Java实现实时的监控文件行尾的追加内容,类似Linux命令 tail -f 在之前的面试中遇到过一个问题,就是用Java实现tail功能,之前的做法是做一个定时任务每隔1秒去读取一次文件,去判断内容是否有追加,如果有则输出新追加的内容,这个做法虽然能勉强实现功能,但是有点太low,今天采用另外一种实现方式,基于事件通知. 1.WatchService 首先介绍一下WatchService类,WatchService可以监控某一个目录下的文件的变动(新增,修改,删除)并以事件的形

  • ASP.NET 在下载文件时对其重命名的思路及实现方法

    有些时候为了保证文件再上传时不会覆盖掉之前上传的文件,同时由于上传的目标目录里的文件可能很多,这个时候一个一个查是不太好的事情,所以这里可以自动生成GUID使文件名重命名成GUID_原来的名称.扩展名.但是在下载的时候最好可能保证恢复到原来的名称.这个时候听伤神的.搜了一下相关资料后得知可使用response来解决.具体代码如下. [csharp]  复制代码 代码如下: <pre name="code" class="csharp">string pa

随机推荐