您的位置:首页 > 运维架构

关于FileSystemWatcher类

2014-02-18 17:07 113 查看
类:System.IO.FileSystemWatcher

首次接触到这个类是在这样的一个用户需求中:

当时需要用一个路径导入资料进DB,导入成功后清除文件;本来新建了一个测试的文件夹,但是文件进来的时机等等不能跟实际相符;又不能直接上线至正式环境;

所以考虑到:将正式环境的文档实时的拷贝至测试环境,也就是文件同步。这才在网上找到这个类,用起来还是挺好的;可以监控文件、文件夹、新建、删除、编辑、修改时间等等。

若要检测某文件夹变化以执行相应程序或代码,可使用System.IO.FileSystemWatcher类

 该类提供以下属性和事件:

fsw.Path = “C:\\”; //设置监控的文件目录 

  

fsw.IncludeSubdirectories = true; //设置监控C盘目录下的所有子目录 

  

fsw.Filter = "*.txt|*.doc|*.jpg"; //设置监控文件的类型 

  

fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; //设置文件的文件名、目录名及文件的大小改动会触发Changed事件 

  

fsw.Created += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle); //绑定事件触发后处理数据的方法。 

  

fsw.Deleted += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle); 

   

 fsw.Changed += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle); 

   

 fsw.Renamed += new RenamedEventHandler(this.fileSystemWatcher_Renamed); //重命名事件与增删改传递的参数不一样。 

  

fsw.EnableRaisingEvents = true; //启动监控 

 设置好检测路径,开启检测后,会在文件夹发生新增/修改/删除时出发相应事件,以操作其他程序或代码。

在使用该类时,也遇到过一些问题,如:

1. 当检测到新建时,不能判断是文件新建还是文件夹新建;

    后来用的 If File.Exists(e.FullName) then .. 表示新建的是文件

2. 新建文件后,将文件拷贝至另外的文件夹,由于是ftp传输,文件尚没有传输完毕,故Copy会报错,后来用了俩个方案一起:

    1. System.Threading.Thread.Sleep(100) 使系统等待100ms,不至于那么快…

    2. 使用While循环,不断的拷贝文件,直到拷贝成功为止;(需设置重复次数 or 时间)

3. 部署至服务器上后,Winform启动的时候直接报错

    纠结了很久,后来才发现,由于filesystemwatcher在Winform界面设置的path为D:\AOI1,是我做测试时的一个本地路径,服务器上没有;故,即使在Winform Load时修改fsw.path也是来不及了;后来干脆在Winform界面直接填写path为C:\,设置EnableRaisingEvents为False;在Load Winform时,设置path,再修改EnableRaisingEvents属性为true

----Jump

2014/02/18
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息