使用FileSystemWatcher监视文件变化

本文转载:http://www.cnblogs.com/zanxiaofeng/archive/2011/01/08/1930583.html

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,确保它被设为真。

问题:

  程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理;但在实际处理中发现当一个文件产生变化时,Change事件被反复触发了好几次。这样可能的结果是造成同一文件的重复处理。
解决方法:

  针对上面的问题,于是写了一个可以延迟FileSystemWatcher发出的事件的Class DelayFileSystemWatcher。

using System;using System.Collections.Generic;using System.IO;using System.Threading;

namespace Utility{    public class DelayFileSystemWatcher    {        private readonly Timer m_Timer;        private readonly Int32 m_TimerInterval;        private readonly FileSystemWatcher m_FileSystemWatcher;        private readonly FileSystemEventHandler m_FileSystemEventHandler;        private readonly Dictionary<String, FileSystemEventArgs> m_ChangedFiles = new Dictionary<string, FileSystemEventArgs>();

public DelayFileSystemWatcher(string path, string filter, FileSystemEventHandler watchHandler, int timerInterval)        {            m_Timer = new Timer(OnTimer, null, Timeout.Infinite, Timeout.Infinite);            m_FileSystemWatcher = new FileSystemWatcher(path, filter);            m_FileSystemWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.CreationTime;            m_FileSystemWatcher.Created += fileSystemWatcher_Changed;            m_FileSystemWatcher.Changed += fileSystemWatcher_Changed;            m_FileSystemWatcher.Deleted += fileSystemWatcher_Changed;            m_FileSystemWatcher.Renamed += fileSystemWatcher_Changed;            m_FileSystemWatcher.EnableRaisingEvents = true;            m_FileSystemEventHandler = watchHandler;            m_TimerInterval = timerInterval;        }

public void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)        {            lock (m_ChangedFiles)            {                if (!m_ChangedFiles.ContainsKey(e.Name))                {                    m_ChangedFiles.Add(e.Name, e);                }            }            m_Timer.Change(m_TimerInterval, Timeout.Infinite);        }

private void OnTimer(object state)        {            Dictionary<String, FileSystemEventArgs> tempChangedFiles = new Dictionary<String, FileSystemEventArgs>();

lock (m_ChangedFiles)            {                foreach (KeyValuePair<string, FileSystemEventArgs> changedFile in m_ChangedFiles)                {                    tempChangedFiles.Add(changedFile.Key, changedFile.Value);                }                m_ChangedFiles.Clear();            }

foreach (KeyValuePair<string, FileSystemEventArgs> changedFile in tempChangedFiles)            {                m_FileSystemEventHandler(this, changedFile.Value);            }        }    }}

使用方式如下:

        s_DelayFileSystemWatcher = new DelayFileSystemWatcher(@"C:\Temp", "*.xml", fileSystemWatcher_Changed, 1500);

private static void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)        {            switch (e.ChangeType)            {                case WatcherChangeTypes.Created:                    //TODO                    break;                case WatcherChangeTypes.Deleted:                    //TODO                                            break;                case WatcherChangeTypes.Changed:                    //TODO                    break;                default:                    break;            }        }

时间: 2024-10-02 16:31:09

使用FileSystemWatcher监视文件变化的相关文章

Javascript监视变量变化的方法_javascript技巧

本文实例讲述了Javascript监视变量变化的方法.分享给大家供大家参考.具体分析如下: 大家应该知道,在C#中对于属性.文件等的更改监视非常简单,因为有委托(事件).FileSystemWatcher等好东东扶持. 那么在JavaScript中,如何对变量的更改进行监视呢?首先,我仿照c#的属性来对JS进行操作,写出了如下的示例: function Class1() { var oldValue=''; var name='xu'; var id='1'; this.setName=func

VB.NET中监视文件夹的变化

摘要 :        有时候,处于业务的需要,我们要不断的监视文件的变化,比如文件的创建.删除.重命名等:而且某些人要确保重要文件的只读,并且要及时的报告文件版本的变更情况.或者,你想监视你的文件夹被别人更改.肆意删除而又不知道是谁干的,在什么时候干的?于是你就考虑要写一个监视程序,"偷偷的"记录文件夹被操作的情况.        有些人采取常规的方式,即写一个桌面应用程序,其界面可能是隐藏的.采用每隔一个事件片段读取文件信息,然后写到一个log文件中.然后设置系统启动的事件自动加载

Javascript监视变量变化的方法

  本文实例讲述了Javascript监视变量变化的方法.分享给大家供大家参考.具体分析如下: 大家应该知道,在C#中对于属性.文件等的更改监视非常简单,因为有委托(事件).FileSystemWatcher等好东东扶持. 那么在JavaScript中,如何对变量的更改进行监视呢?首先,我仿照c#的属性来对JS进行操作,写出了如下的示例: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

并于监听oracle数据库文件变化的问题!

问题描述 各位大哥,大姐,我现在打算做一个监听程序,监视oracle中一个数据库文件的变化,例如文件大小,最后一次修改时间的变化,通过这种变化,确定是否对数据库进行了更改,例如更改数据库记录等(首先,我要说的是这么做是有原因的,别人不允许在他的数据库中更改任何东西,如添加触发器等等,因此只能通过监视文件的方式来处理问题),我采用了C#中的fileSystemwatcher对文件进行监视,但是很遗憾,我发现在oracle中,你更改了数据库中的一条记录,他的DBF文件大小并没有受到影响,而且他的最后

Linux 监视文件、文件夹改动

/******************************************************************** * Linux 监视文件.文件夹改动 * 说明: * 主要是为了解决当配置文件被修改时,需要重新对配置文件解析,并应用 * 配置文件,这样可以解决修改了配置文件,需要重启系统或者重启软件的需求. * * 2017-4-26 深圳 龙华樟坑村 曾剑锋 *******************************************************

wav-WAV文读取问题,需要对WAV音频加噪声然后再滤波,对比前后WAV文件变化,是一个练手程序,

问题描述 WAV文读取问题,需要对WAV音频加噪声然后再滤波,对比前后WAV文件变化,是一个练手程序, 我想知道WAV音频加噪声,噪声的均值后方差大小有什么要求?均值应该为0吧.方差就不知道取多大了. 还有就是c++怎么绘图?我已经把WAV文件读到一个数组中,是不是只有GDI,MFC可以搞?横坐标应该选什么?应该是采样频率吧? 算法入口那边还有点不清楚.是把采样到的数组与采样频率为两参数 直接调用算法?, 大神帮帮忙.多谢了.

ASP.NET网站发布前后文件变化和异同

问题描述 ASP.NET网站发布前后文件变化和异同 ASP.NET网站发布前与发布后中的文件有什么变化变化和异同 解决方案 你猜 过了一年了 你肯定知道了!

elasticsearch-如何使logstash远程监控另一台windows上的日志文件变化

问题描述 如何使logstash远程监控另一台windows上的日志文件变化 因为业务上的原因,现在想使用logstash来远程监控一台windows上面的日志变化(windows是台UAT部署机,不想装别的软件),logstash的shipper.conf怎么写?主要是选用哪个input的插件及配置大概怎么写,用file的话,好像得把logstash在那台UAT上装一次才能监控文件夹的变化...求大神指教..感激不尽

java实现文件变化监控的方法(推荐)_java

一. spring配置文件:application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://ww