C# FileSystemWatcher监听文件事件
现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来.
这里用到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 = ;
static FileSystemWatcher watcher = new FileSystemWatcher();
static int eventCount = ; //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 = ;
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[];
startTime = args[];
InitializeComponent(); timer1.Interval = ;
timer1.Tick += button1_Click;
timer1.Enabled = true;
this.Text = "FileCreater" + filePre + "_" + startTime;
this.numericUpDown1.Value = int.Parse(args[]);
} 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 = ; 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
C# FileSystemWatcher监听文件事件的更多相关文章
- FileSystemWatcher监听文件事件
现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...
- 关于FileSystemWatcher监听文件创建
FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...
- 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了
当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成.不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”. 那 ...
- FileSystemWatcher监听文件是否有被修改
作用:监听文件系统更改通知,并在目录或目录中的文件更改时引发事件. 需求:监听特定文件是否修改,然后做出相应的操作. 方法: ①利用一个线程,一直去查找该指定的文件是否有被修改,如果修改则操作特定步骤 ...
- 使用FileSystemWatcher监听文件状态
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 一.FileSystemWatcher类型介绍 在.NET中使用 FileSystemWatcher 类型可以进行监视指定 ...
- linux实时文件事件监听--inotify
一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系 ...
- c# 监听文件夹动作
static FileSystemWatcher watcher = new FileSystemWatcher(); /// <summary> /// 初始化监听 ...
- C#监听文件
//全局变量 public static FileSystemWatcher Watcher; /// <summary> /// 设置监听配置 /// < ...
- Delphi目录监控、目录监听
资料地址: 1.https://www.cnblogs.com/studypanp/p/4890970.html 单元代码: (************************************ ...
随机推荐
- spring注解说明之Spring2.5 注解介绍(3.0通用)
spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...
- UE4 执行Console Command ----ExecuteConsoleCommand
void UKismetSystemLibrary::ExecuteConsoleCommand(UObject* WorldContextObject, const FString& Com ...
- HDU 4691 正解后缀数组(暴力也能过)
本来是个后缀数组,考察算法的中级题目,暴力居然也可以水过,就看你跳不跳坑了(c++和G++返回结果就很不一样,关键看编译器) 丝毫不差的代码,就看运气如何了.唯一差别c++还是G++,但正解是后缀数组 ...
- 关于上传app遇到的一些棘手的小问题
最近上传了一个app,由于是第一次上传,花费在这上面的时间不比做app的耗时短啊....说多了都是泪.下面为了不让大家掉坑里去,分享一些小经验: 1.使用别人的开发者账号上传完自己的app(本人暂无开 ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, NSArray *paths = NSSearchPathForDirectoriesInDomains ...
- Python 基礎 - 列表的使用
如果想要存所有 Marvel's The Avengers 角色的人名,該如何存呢?請用目前已學到的知識來實做- #!/usr/bin/env python3 # -*- coding:utf-8 - ...
- 优化 UltraEdit 打开大文件时的性能
UltraEdit 原本就是被设计成可以打开超大文件的工具,只不过在默认情况下需要进行以下优化设置: 禁止临时文件 禁止显示行号 禁止文件(回车 & 换行符)转换 禁止代码折叠 禁止显示函数列 ...
- 苹果Home键恢复(无工具篇)
无工具法: 弹指神功.用手指轻轻弹Home,过了一阵子后可能会出现白色污垢,其后再重覆“弹”,直至正常为止.(亲测可用) 软件调试法.首先,打开任意一款应用程序,按住电源开关几秒钟,直到屏幕出现滑动关 ...
- HDU 3342 Legal or Not(判断是否存在环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Othe ...
- ab中文手册
名兒 NAME ab - Apache HTTP 服務器性能測試工具 總覽 SYNOPSIS ab [ -A auth-username:password ] [ -c concurrency ...