【C# IO 操作】 文件系统侦听 FileSystemWatcher
侦听器 :
FileSystemWatcher
- FileSystemWatcher常用属性有:
- Filter :获取或设置用于确定目录中要监视哪些文件的过滤器字符串。Filter 属性设置为空字符串 ("") 或使用通配符(“*.*”)。若要监视特定的文件,请将 Filter 属性设置为该文件名。例如,若要监视文件 MyDoc.txt 中的更改,请将 Filter 属性设置为“MyDoc.txt”。也可以监视特定类型文件中的更改。例如,若要监视文本文件中的更改,请将 Filter 属性设置为“*.txt”。
- IncludeSubdirectories:获取或设置是否监控被监控目录的子目录。
- InternalBufferSize:内部缓冲区大小,最大为64K(侦听网络时候用),默认为8K。
InternalBufferSize消息池是存放通知程序文件的修改信息,如果同一时刻有很多的文件被修改是可能溢出,FileSystemWatcher并不保证捕获所有的修改,InternalBufferSize消息池,如果溢出则会造成事件丢失,可以设置这个值,fsWather.InternalBufferSize
= XXXXXX(默认值为 8192
(8K)。);项目中只是监视某个文件夹中修改时间最新的文件,始终只是一个TXT文件,所以没有修改默认值,已经很够用了,具体多块的同时修改多少个文件会超出默认的8192,这边内存使用的是非分页缓冲内存(Non paged memory pool)点开任务管理器的性能一栏,可以看到下面的非分页缓冲池(Non paged memory pool)达到了1个G,这说明某个驱动发生了内存泄露(memory leak)。治标的解决办法只有关机重启。治本的解决方法是更新所有驱动。
如果你不愿意更新所有的驱动,那么就要下载一款名为poolmoon的软件,分析是哪个东西造成的高非分页内存占用,然后更新一下就行了。

- path:需要监控的文件夹路径
- EnableRaisingEvents :设置是否开始监控。(默认为fals
- NotifyFilter :设置文件的哪些属性的变动会触发Changed事件,可设置的类型如下:
- Attributes -- 文件或文件夹的属性。
CreationTime -- 文件或文件夹的创建时间。
DirectoryName -- 目录名。(常用) //用来侦听名字变更的,配合rename事件使用
FileName -- 文件名。 (常用)//用来侦听名字变更的,配合rename事件使用
LastAccess -- 文件或文件夹上一次打开的日期。
LastWrite -- 上一次向文件或文件夹写入内容的日期。 //杀毒软件会修改LastWrite,会触发changge
Security -- 文件或文件夹的安全设置。
Size -- 文件或文件夹的大小。 (常用)
使用 FileSystemWatcher 类时,请注意以下事项。
1) 对包括隐藏文件(夹)在内的所有文件(夹)进行监控。
2) 您可以为 InternalBufferSize 属性(用于监视网络上的目录)设置的最大大小为 64 KB。
枚举:
WatcherChangeTypes
子项:All -- 文件或文件夹的创建、删除、更改或重命名。
Changed -- 文件或文件夹的更改。更改的类型包括大小、属性、安全设置、最近写入时间和最近访问时间方面的更改。
Created -- 文件或文件夹的创建。
Deleted -- 文件或文件夹的删除。
Renamed -- 文件或文件夹的重命名。
事件参数:
FileSystemEventArgs
ErrorEventArgs
RenamedEventArgs
FileSystemEventArgs 对象:
成员: Name: 获取受影响的文件或目录的名称。 注意:如果是级联监控子目录的话,该值为从监控目录的下个目录到受影响的文件的路径,而不只是受影响的文件名。
FullPath : 获取受影响的文件或目录的完全限定的路径。
ChangeType :获取受影响的文件或目录的发生的事件类型。
RenamedEventArgs 对象:
成员: Name: 获取受影响的文件或目录的新名称。
OldName : 获取受影响的文件或目录的旧名称。
FullPath : 获取受影响的文件或目录的完全限定的路径。
OldFullPath : 获取受影响的文件或目录的前一个完全限定的路径。
ChangeType :获取受影响的文件或目录的发生的事件类型。
事件委托:
FileSystemEventHandler
ErrorEventHandler
RenamedEventHandler
FileSystemWatcher使用时候遇到的问题:
1、C#中FileSystemWatcher类的Changed事件触发多次的问题,解决方案如下:
void OnChange(object sender, FileSystemEventArgs e)
{
bool let = false;
if (let )
{
Console.WriteLine($"{e.Name} changing");
let = true;
}
else
{
let = false; }
}
2、杀毒软件会修改lasswrite 从而触发 change事件。解决方案如下:
不添加 NotifyFilter.lasswrite枚举
filters = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName //这个是rename事件 用的
| NotifyFilters.FileName //这个是rename事件 用的
| NotifyFilters.LastAccess
| NotifyFilters.Security
| NotifyFilters.Size;*/
class FileSystemWatcherTest
{ static void Main()
{
#region 新建文件夹和文件
//把桌面设置为当前目录
Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); //在当前目录新建文件夹
DirectoryInfo directoryInfo = new DirectoryInfo("WatcherTest");
directoryInfo.Create(); //显示当前目录
Console.WriteLine(Environment.CurrentDirectory); //在WatcherTest 目录新建文件
FileInfo fileInfo = new FileInfo(Path.Combine(directoryInfo.Name, "readme.txt"));
var filestream= fileInfo.Create(); //关闭文件流
filestream.Close(); //创建子文件夹
DirectoryInfo subinfo = directoryInfo.CreateSubdirectory("sub");
subinfo.Create(); //在子文件夹sub下创建 文件sub2.txt
FileInfo subinfo2 = new FileInfo(Path.Combine(subinfo.FullName, "sub2.txt"));
FileStream subfs = subinfo2.Create();
subfs.Close();// 在删除文件之前必须删除FileSteam
#endregion #region 监听刚刚新建的文件夹和文件 变更情况
using var watcher = new FileSystemWatcher(directoryInfo.FullName); watcher.Filter = "*.txt";
watcher.NotifyFilter = NotifyFilters.Security |
NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.LastAccess |
NotifyFilters.FileName |
NotifyFilters.DirectoryName |
NotifyFilters.Size; /* watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;*/ watcher.Changed += Changed;
watcher.Created += Created;
watcher.Renamed += Renamed;
watcher.Deleted += Deleted;
watcher.Error += Error; //是否侦听子目录
watcher.IncludeSubdirectories = true; //允许触发侦听事件
watcher.EnableRaisingEvents = true; while (Console.Read()!='q') ; watcher.Dispose(); #endregion } private static void Error(object sender, ErrorEventArgs e)
{
Console.WriteLine($"Error:{0}", e.ToString());
} private static void Deleted(object sender, FileSystemEventArgs e)
{
Console.WriteLine($"{e.Name} is Deleted");
} private static void Renamed(object sender, RenamedEventArgs e)
{
Console.WriteLine($"{e.OldName} Renamed :{e.Name}");
} private static void Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine($"{e.Name} Created :{e.FullPath}");
} private static void Changed(object sender, FileSystemEventArgs e)
{
if(e.ChangeType == WatcherChangeTypes.Changed)
Console.WriteLine($"{e.Name}Changed:{e.FullPath}"); }
}
【C# IO 操作】 文件系统侦听 FileSystemWatcher的更多相关文章
- vue02 过滤器、计算和侦听属性、vue对象的生命周期、阻止事件冒泡和刷新页面
3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 3.1.1 使用Vue.fil ...
- WCF:没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的。
没有终结点在侦听可以接受消息的 http://xx.com/WebService.svc. 这通常是由于不正确的地址或者 SOAP 操作导致的.如果存在此情况,请参见 InnerException 以 ...
- WCF: 没有终结点在侦听可以接受消息的 这通常是由于不正确的地址或者 SOAP 操作导致的。
问题: 由于我这里的wcf服务是采用“BasicHttpBinding”的方式,即安全绑定模式,客户端在引用这个服务后所生成的终结点配置(endpoint )就变成了<endpoint ...
- 客服端调用自定义宿主的WCF报错"没有终结点在侦听可以接受消息的http://localhost:8085/mex。这通常是由于不正确的地址或者 SOAP 操作导致的错误"的解决方案。
没有终结点在侦听可以接受消息的http://localhost:8085/mex.这通常是由于不正确的地址或者 SOAP 操作导致的错误. 这个错误是由于没有启动元数据交换终结点(MEX)导致的.在宿 ...
- 怎么配置 Oracle 侦听器来使用SQL操作ST_Geometry
关于这个内容,其实从ArcSDE9.2推出ST_Geometry就让用户感到很有吸引力,而且特别是在ArcSDE9.3之后,用户使用SQL操作ST_geometry越来越多,但是在配置Oracle监听 ...
- 计算属性 vs 侦听属性 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的
https://cn.vuejs.org/v2/guide/computed.html#基础例子 计算属性 vs 侦听属性 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属 ...
- 没有终结点在侦听可以接受消息的 http://192.168.1.63:8085/LoginService。这通常是由于不正确的地址或者 SOAP 操作导致的
2016-04-08 09:15:05,581 [8] ERROR System.Threading.Thread - ErrorSystem.ServiceModel.EndpointNotFoun ...
- Vue中计算属性、侦听、过滤、自定义指令、ref的操作
1.计算属性 <div id="app"> <input type="text" v-model="x"> < ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
随机推荐
- fidder返回参数Raw乱码问题
- 经典面试题:分布式缓存热点KEY问题如何解决--有赞方案
有赞透明多级缓存解决方案(TMC) 一.引子 1-1. TMC 是什么 TMC ,即"透明多级缓存( Transparent Multilevel Cache )",是有赞 Paa ...
- 字节跳动 iOS Heimdallr 卡死卡顿监控方案与优化之路
点这里申请 本文主要介绍Heimdallr对卡死.卡顿异常的监控原理,并结合长时间的业务沉淀发现的问题进行不断迭代和优化,逐步实现全面.稳定.可靠的历程. 作者:字节跳动终端技术--白昆仑 前言 卡死 ...
- 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...
- 随机IP代理插件Scrapy-Proxies
安装: pip install scrapy_proxies github: https://github.com/aivarsk/scrapy-proxies scrapy爬虫配置文件setti ...
- 普通web项目一直无法访问页面,直接报404
错误:普通web项目一直无法访问页面,直接报404 原因:写了一个过滤乱码的类: 而在类上加了WebServlet注解,其实应该是WebFilter注解, 总结:基础不扎实,有些东西只会用,而不知道原 ...
- 布局TabBar
布局TabBar中的items Tabbar中应该有5个Item 主页/消息/发布按钮/发现/我 布局TabBar中的Items可以通过下面的方式 通过自定义TabBar的方式 多添加一个控制器,让中 ...
- cookie、session、jsession 关系
感谢大佬:https://www.cnblogs.com/fsjin/articles/3490531.html 在使用CAS的时候,对Cookies.session.jsession 这三者是什么不 ...
- 消息队列 - mac上安装RabbitMq (转)
什么是RabbitMQ? RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为面向消息的中间件).支持WIndows.Linux.MAC OS 操作系 ...
- OC和C对比
1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...