首页 谈谈C 文件监控对象FileSystemWatcher使用感

谈谈C 文件监控对象FileSystemWatcher使用感

举报
开通vip

谈谈C 文件监控对象FileSystemWatcher使用感谈谈C 文件监控对象FileSystemWatcher使用感 谈谈C 文件监控对象 FileSystemWatcher使用感 原文() 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务器做别的操作,而那个文本的写入有时候会频繁,1秒可能多次,但是也有可能在相当长一段时间内是没有任何写入的。 这样一来如果每秒都去访问文件的话,一个是IO问题,还有就是每次操作都...

谈谈C 文件监控对象FileSystemWatcher使用感
谈谈C 文件监控对象FileSystemWatcher使用感 谈谈C 文件监控对象 FileSystemWatcher使用感 原文() 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务器做别的操作,而那个文本的写入有时候会频繁,1秒可能多次,但是也有可能在相当长一段时间内是没有任何写入的。 这样一来如果每秒都去访问文件的话,一个是IO问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 ,还有就是每次操作都会引起后端一系列程序的反应,文本在长时间内无写入的话,一秒一次的触发一系列徒劳的事情太不可取了。 最终发现了c#中的FileSystemWatcher对象,在应用FileSystemWatcher 之前,首先了解一下这个对象的基本属性和事件,首先普及一下FileSystemWatcher基本知识。 FileSystemWatcher基础 属性: Path——这个属性告诉FileSystemWatcher它需要监控哪条路径。例如,如果我们将这个属性设为“C:\test”,对象就监控test目录下所有文件发生的所有改变(包括删除,修改,创建,重命名)。 IncludeSubDirectories——这个属性说明FileSystemWatcher对象是否应该监控子目录中(所有文件)发生的改变。 Filter——这个属性允许你过滤掉某些类型的文件发生的变化。例如,如果我们只希望在TXT文件被修改/新建/删除时提交通知,可以将这个属性设为“*txt”。在处理高流量或大型目录时,使用这个属性非常方便。 NotifyFilter——获取或设置要监视的更改类型。可以进一步的过滤要监控的更改类型,如watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; 事件: Changed——当被监控的目录中有一个文件被修改时,就提交这个事件。值得注意的是,这个事件可能会被提交多次,即使文件的内容仅仅发生一项改变。这是由于在保存文件时,文件的其它属性也发生了改变。 Created——当被监控的目录新建一个文件时,就提交这个事件。如果你计划用这个事件移动新建的事件,你必须在事件处理器中写入一些错误处理代码,它能处理当前文件被其它进程使用的情况。之所以要这样做,是因为Created事件可能在建立文件的进程释放文件之前就被提交。如果你没有准备正确处理这种情况的代码,就可能出现异常。 Deleted——当被监控的目录中有一个文件被删除,就提交这个事件。 Renamed——当被监控的目录中有一个文件被重命名,就提交这个事件。 注:如果你没有将EnableRaisingEvents设为真,系统不会提交任何一个事件。如果有时FileSystemWatcher对象似乎无法工作,请首先检查EnableRaisingEvents,确保它被设为真。 事件处理 当FileSystemWatcher调用一个事件处理器时,它包含两个自变量——一个叫做“sender”的对象和一个叫做“e”的 FileSystemEventArgs对象。我们感兴趣的自变量为FileSystemEventArgs自变量。这个对象中包含有提交事件的原因。以下是FileSystemEventArgs对象的一些属性: 属性: Name——这个属性中使事件被提交的文件的名称。其中并不包含文件的路径——只包含使用事件被提交的文件或目录名称。 ChangeType——这是一个WatcherChangeTypes,它指出要提交哪个类型的事件。其有效值包括: Changed Created Deleted Renamed FullPath——这个属性中包含使事件被提交的文件的完整路径,包括文件名和目录名。 注意:FileSystemEventArgs对象是监控文件夹下有文件创建、删除、修改时的自变量,如果是重命名的话为RenamedEventArgs对象此时除了FileSystemEventArgs对象的属性值,多了一个OldFullPath,为重命名之前的文件名。 以上为FileSystemEventArgs的基本知识,大部分是从网上搜找的然后自己稍微整理了一下。 下面为简单用法: ? 1 using 2 System; 3 using 4 System.IO; 5 namespace 6 test 7 { 8 class 用上面的方法会发现,在一次文本文件变化的时候OnChanged事件会触发 两次,这是因为除了文本内容变化之外还有文件其他的属性也变化了例如修改 时间。 为了解决这问题,也便于项目当中实际使用,写了下面几个类来实际使用: 主方法: ? 1 using 2 System; 3 using WatcherProcess类: 4 System.IO; 5 namespace 6 test 7 { 8 class ? 9 Program 10 { 1 using 11 static 2 System.IO; 12 void 3 namespace MyFileSystemWather类: 13 Main( 4 test 14 string 5 { 15 [] args) 6 public ? 16 { 7 class 17 MyFileSystemWather myWather = 8 WatcherProcess 1 using 18 new 9 { 2 System; 19 MyFileSystemWather( 10 private 3 using 使用了线程安全的Hashtable来处理一次改变触发两次事件的问题,要注20 @"C:\test" 11 object 4 System.Collections; 21 , 意的是在实际项目使用中,在通过监控文件事情触发时开一个线程12 sender; 5 using 22 "*.txt" WatcherProcess去处理自己业务逻辑的时候,不管业务逻辑成功或者失败(例13 private 6 System.IO; 23 ); 如有异常抛出一定要try一下)一定要让WatcherProcess的 Completed也就14 object 7 using 24 myWather.OnChanged += 15 eParam; 8 System.Threading; 25 new 16 public 9 namespace 26 FileSystemEventHandler(OnChanged); 17 event 10 test 27 myWather.OnCreated += 18 RenamedEventHandler OnRenamed; 11 { 是MyFileSystemWather的WatcherProcess_OnCompleted执行去移除对应变化文件的Hashtable的key,不然下次此文件改变时是无法触发你的业务逻辑的。 还有就是在进行文件监控的时候, 被监控文件在写入的时候,是会有I/O冲突的,即使写入文件是FileShare.Read的也会出现,要真正解决貌似只有FileMaping方法,但是我的项目中文本的写入软件不是我们能控制的,所以只有用处理异常的方法来解决。 各位有什么好的建议可以留言大家讨论讨论
本文档为【谈谈C 文件监控对象FileSystemWatcher使用感】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_713593
暂无简介~
格式:doc
大小:17KB
软件:Word
页数:5
分类:生活休闲
上传时间:2018-04-15
浏览量:12