【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 ...
随机推荐
- 线程同步介绍及 生产者消费者问题举例 C#版
现在有五个工人在果园摘水果,一次只能摘一个,摘下的水果放入一个框中,这种框最多只能装50个橘子,一共有两个这样的框.当一个工人装框时,其他工人不能在使用这个框.当两个框都装满了,工人只有等框里有剩余位 ...
- gin初识
Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍. 如果你是性能和 ...
- 前端基础之CSS(浮动-解决溢出-实现个人头像框)
目录 一:浮动float 1.什么是浮动? 2.浮动的作用 3.浮动有两个特点 4.float格式 二:代码实现左右浮动边框 三:浮动造成父标签塌陷问题(清除浮动) 1.浮动会造成父标签的影响 三:清 ...
- Python与Javascript相互调用超详细讲解(四)使用PyNode进行Python与Node.js相互调用项(cai)目(keng)实(jing)践(yan)
目录 前提 安装 使用 const pynode = require('@fridgerator/pynode')的时候动态链接错误 ImportError: math.cpython-39-x86_ ...
- BERT-MRC:统一化MRC框架提升NER任务效果
原创作者 | 疯狂的Max 01 背景 命名实体识别任务分为嵌套命名实体识别(nested NER)和普通命名实体识别(flat NER),而序列标注模型只能给一个token标注一个标签,因此对于嵌套 ...
- STC8H开发(九): STC8H8K64U模拟USB HID外设
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- Go 记录一次groutine通信与context控制
需求背景: 项目中需要定期执行任务A来做一些辅助的工作,A的执行需要在超时时间内完成,如果本次执行超时了,那就不对本次的执行结果进行处理(即放弃这次执行).同时A又依赖B,C两个子任务的执行结果.B, ...
- LockSupport、wait()、notify()
LockSupport 名词解释 LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中. 代码 publ ...
- JAVA多线程学习十六 - 同步集合类的应用
1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...
- linux内核中的eventfd
转载请注明来源:https://www.cnblogs.com/hookjc/ eventfd 在内核版本,2.6.22以后有效.查看内核版本可以用命令 uname -r . [cpp] view p ...