现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来.

这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中。

监听部分的代码如下:

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.Windows.Forms;

namespace FileEventListener
{
    public partial class FSWControl : Form
    {
        static int count = 0;
        static FileSystemWatcher watcher = new FileSystemWatcher();
        static int eventCount = 0;

        //static List<string> files = new List<string>();
        public FSWControl()
        {
            InitializeComponent();
            WatcherStrat(@"D:\test\", "*.tr", true, true);
        }

        /// <summary>
        /// 初始化监听
        /// </summary>
        /// <param name="StrWarcherPath">需要监听的目录</param>
        /// <param name="FilterType">需要监听的文件类型(筛选器字符串)</param>
        /// <param name="IsEnableRaising">是否启用监听</param>
        /// <param name="IsInclude">是否监听子目录</param>
        private static void WatcherStrat(string StrWarcherPath, string FilterType, bool IsEnableRaising, bool IsInclude)
        {
            //初始化监听
            watcher.BeginInit();
            //设置监听文件类型
            watcher.Filter = FilterType;
            //设置是否监听子目录
            watcher.IncludeSubdirectories = IsInclude;
            //设置是否启用监听?
            watcher.EnableRaisingEvents = IsEnableRaising;
            //设置需要监听的更改类型(如:文件或者文件夹的属性,文件或者文件夹的创建时间;NotifyFilters枚举的内容)
            watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
            //设置监听的路径
            watcher.Path = StrWarcherPath;
            //注册创建文件或目录时的监听事件
            //watcher.Created += new FileSystemEventHandler(watch_created);
            //注册当指定目录的文件或者目录发生改变的时候的监听事件
            watcher.Changed += new FileSystemEventHandler(watch_changed);
            //注册当删除目录的文件或者目录的时候的监听事件
            watcher.Deleted += new FileSystemEventHandler(watch_deleted);
            //当指定目录的文件或者目录发生重命名的时候的监听事件
            watcher.Renamed += new RenamedEventHandler(watch_renamed);
            //结束初始化
            watcher.EndInit();
        }

        /// <summary>
        /// 创建文件或者目录时的监听事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void watch_created(object sender, FileSystemEventArgs e)
        {
            //事件内容
            output("create:" + e.FullPath);
        }

        /// <summary>
        /// 当指定目录的文件或者目录发生改变的时候的监听事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void watch_changed(object sender, FileSystemEventArgs e)
        {
            //事件内容
            //事件内容
            output("change:" + e.FullPath);
        }
        /// <summary>
        /// 当删除目录的文件或者目录的时候的监听事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void watch_deleted(object sender, FileSystemEventArgs e)
        {
            //事件内容
            output("del:" + e.FullPath);
        }
        /// <summary>
        /// 当指定目录的文件或者目录发生重命名的时候的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void watch_renamed(object sender, RenamedEventArgs e)
        {
            //事件内容
            output("rename:" + e.FullPath);
        }
        /// <summary>
        /// 启动或者停止监听
        /// </summary>
        /// <param name="IsEnableRaising">True:启用监听,False:关闭监听</param>
        private void WatchStartOrSopt(bool IsEnableRaising)
        {
            watcher.EnableRaisingEvents = IsEnableRaising;
        }

        private static void output(string text)
        {
            //FileStream fs = new FileStream("D:\\listen.txt", FileMode.Append);
            //StreamWriter sw = new StreamWriter(fs, Encoding.Default);
            //sw.WriteLine(text);
            //sw.Close();
            //fs.Close();
            //files.Add(text);
            eventCount++;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string name = count.ToString() + "_" + eventCount.ToString();
            FileStream fs = new FileStream("D:\\listen_" + name + ".txt", FileMode.Append);
            StreamWriter sw = new StreamWriter(fs, Encoding.Default);
            //foreach (string text in files)
            //{
            //    sw.WriteLine(text);
            //}
            sw.WriteLine("共收到事件:" + eventCount.ToString());
            //files.Clear();
            eventCount = 0;
            sw.Close();
            fs.Close();
            count++;
            MessageBox.Show("打印完成:" + name, "提示", MessageBoxButtons.OK);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            WatchStartOrSopt(false);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            WatchStartOrSopt(true);
        }
    }
}

然后写一个生成文件的程序用于测试,由于可能需要多个写入一起跑,采用传入参数的方式进行调用程序。共三个参数:第一个为标识,第二个为生成文件的数量,第三个为开始运行的时间:

如 FileCreater.exe 1 1000 121000 则表示这个实例的名称为1,连续生成1000个文件,在12:10:00开始执行。

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.Windows.Forms;

namespace FileCreater
{
    public partial class Form1 : Form
    {
        string filePre = "";
        string startTime = "";

        public Form1(string[] args)
        {
            filePre = args[0];
            startTime = args[2];
            InitializeComponent();

            timer1.Interval = 100;
            timer1.Tick += button1_Click;
            timer1.Enabled = true;
            this.Text = "FileCreater" + filePre + "_" + startTime;
            this.numericUpDown1.Value = int.Parse(args[1]);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label3.Text = DateTime.Now.ToString("HHmmss") + "|" + startTime;
            if (int.Parse(DateTime.Now.ToString("HHmmss")) > int.Parse(startTime))
            {
                label3.Text = numericUpDown1.Value.ToString();
                for (int i = 1; i <= numericUpDown1.Value; i++)
                {
                    //string time = DateTime.Now.ToString("ddhhMMss");
                    string file = string.Format(@"{0}\{1}_{2}.tr", textBox1.Text, i, filePre);
                    FileStream fs = new FileStream(file, FileMode.Append);
                    StreamWriter sw = new StreamWriter(fs, Encoding.Default);
                    sw.WriteLine(i.ToString());
                    sw.Close();
                    fs.Close();
                }
                timer1.Stop();
            }
            //MessageBox.Show("已完成", "提示", MessageBoxButtons.OK);

            Application.Exit();
        }
    }
}

测试过程中发现如下现象:

1.一个生成文件程序,连续生成10W的文件时会发生计数器记录下的值小于或多于10W

FileSystemWatcher监听文件事件的更多相关文章

  1. C# FileSystemWatcher监听文件事件

    现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...

  2. 关于FileSystemWatcher监听文件创建

    FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...

  3. 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

    当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成.不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”. 那 ...

  4. FileSystemWatcher监听文件是否有被修改

    作用:监听文件系统更改通知,并在目录或目录中的文件更改时引发事件. 需求:监听特定文件是否修改,然后做出相应的操作. 方法: ①利用一个线程,一直去查找该指定的文件是否有被修改,如果修改则操作特定步骤 ...

  5. 使用FileSystemWatcher监听文件状态

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 一.FileSystemWatcher类型介绍 在.NET中使用 FileSystemWatcher 类型可以进行监视指定 ...

  6. linux实时文件事件监听--inotify

    一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系 ...

  7. c# 监听文件夹动作

    static FileSystemWatcher watcher = new FileSystemWatcher(); /// <summary>        /// 初始化监听     ...

  8. C#监听文件

    //全局变量 public static FileSystemWatcher Watcher; /// <summary>        /// 设置监听配置        /// < ...

  9. Delphi目录监控、目录监听

    资料地址: 1.https://www.cnblogs.com/studypanp/p/4890970.html 单元代码: (************************************ ...

随机推荐

  1. java poi

    import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.a ...

  2. django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件

    目录 一.ajax结合sweetalter 二.bulk_create批量插入数据 三.简易版分页器推导 1. 推导步骤 四.自定义分页器的使用 1. 自定义分页器模板 2. 使用方法 (1)后端代码 ...

  3. qt5-信号和槽

    信号函数: connect(btn,&QPushButton::clicked,this,&QWidget::close); //参数1 信号发送者://参数2 信号:---& ...

  4. spark读取hbase(NewHadoopAPI 例子)

    package cn.piesat.controller import java.text.{DecimalFormat, SimpleDateFormat}import java.utilimpor ...

  5. Python 正则表达式Ⅴ

    正则表达式实例 字符匹配 字符类 特殊https://www.xuanhe.net/字符类

  6. inline元素导航栏案例

    练习一个超链接元素在文档流当中,a标签显示出来的inline这种元素的特性.我们可以用display来将它转换成inline-block类型,这样我们就可以设置它的高度,宽度和它的背景颜色等等特性了. ...

  7. CF 672C 两个人捡瓶子 最短路与次短路思想

    C. Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. HDU 6667 Roundgod and Milk Tea

    hdu题面 Time limit 6000 ms Memory limit 131072 kB OS Windows Source 2019 Multi-University Training Con ...

  9. 浏览器使用小tip

    谷歌浏览器截取长图 很多网页长图单个页面截不下来,那么需要如何解决? 首先,在谷歌浏览器chrome中打开需要截图的网页,等待需要截图的网页打开完毕,然后按F12 打开开发者工具,然后按组合键 Ctr ...

  10. SNMP命令

    snmp命令 配置管理网络协议Weblogic项目管理Cisco Snmputil 命令 Snmputil是一个命令行下的软件,使用语法如下: usage: snmputil get|getnext| ...