【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 ...
随机推荐
- Collection类集
1.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的 ...
- vue学习4-class和sytle绑定
#### Class绑定: 1. 通过数组的方式来实现: 2. 通过对象的方式来实现: 通过对象: 通过数组,通过数组是把多个style样式对象添加进去:
- fidder返回参数Raw乱码问题
- Solon 1.6.18 发布,轻量级应用开发框架
关于官网 千呼万唤始出来: https://solon.noear.org .整了一个月多了...还得不断接着整! 关于 Solon Solon 是一个轻量级应用开发框架.支持 Web.Data.Jo ...
- 什么是VPC
1 什么是私有网络(VPC) 私有网络是一块可用户自定义的网络空间,您可以在私有网络内部署云主机.负载均衡.数据库.Nosql快存储等云服务资源.您可自由划分网段.制定路由策略.私有网络可以配置公网网 ...
- vi与vim编辑器与解决vim编辑异常
目录 一:vi与vim编辑器 二:解决vim编辑异常 一:vi与vim编辑器 vim是vi的升级版编辑器,就是vim比vi丰富一些. 1.安装vim 命令 yum install vim -y 2.打 ...
- Gc如何判断对象可以被回收?
Gc如何判断对象可以被回收? 1 引用计数器 引用计数法的算法思路:给对象增加一个引用计数器,每当对象增加一个引用计数器+1,失去一个引用-1,所以当计数器是0的时候对象就没有引用了,就会被认为可回收 ...
- Python中open函数怎么操作文件--9
转:https://www.tuicool.com/wx/vYjaYnV 在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open ...
- SIFT Learing records
目录 SIFT算法的步骤 小结 附录代码 花了一周的时间去读了一下SIFT的原论文,相关的一些视频还有文章,大体了解了其思想和步骤,在这里记录一下吧. SIFT是一种提取图像中具有尺度不变性的关键点的 ...
- What Goes Up Must Come Down
跳转链接 题目描述 给定一个序列, 求出将此序列变换为单调递增.单调递减 或者先增后减 样例1 输入 7 3 1 4 1 5 9 2 输出 3 样例2 输入 9 10 4 6 3 15 9 1 1 1 ...