在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的基本知识,大部分是从网上搜找的然后自己稍微整理了一下。

下面为简单用法:

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = @"C:\test";
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                                   | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            watcher.Filter = "*.txt";

            watcher.Changed += (s,e1)=> this.Dispatcher.Invoke(new Action(() =>
            {
                label1.Content = e1.Name + "被修改!";
            }));
            watcher.Created += (s, e1) =>  this.Dispatcher.Invoke(new Action(() => { label1.Content = e1.Name + "被添加!"; }));
            watcher.Deleted += (s, e1) =>  this.Dispatcher.Invoke(new Action(() => { label1.Content = e1.Name + "被删除!"; }));
            watcher.Renamed += (s, e1) =>  this.Dispatcher.Invoke(new Action(() =>
            {
                label1.Content = e1.OldName + "被重命名为:"+e1.Name;
            }));

            //开始监视
            watcher.EnableRaisingEvents = true;
        }
    }
}

 

 

 

时间: 2024-08-02 11:54:15

在C#使用文件监控对象FileSystemWatcher 实现数据同步的相关文章

使用文件监控对象FileSystemWatcher实现数据同步

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

webtail——文件监控

文件监控直接通过了linux的inotify接口实现.这里没有考虑移植性,也就没像tailf那样,通过宏来判断是否支持inotify,如果不支持,降级使用循环轮寻的方式读取. inotify的使用还是比较方便的基本上就是:inotify_init,inotify_add_watch,然后配合read系统调用,获取文件修改信息.因此实现也非常方便. 首先是在构造函数里面初始化inotify: [cce lang="cpp"] inotifyFd = inotify_init(); [/c

厂商优劣势解析:Gartner分布式文件及对象存储市场魔力象限

Gartner发布了一款分布式文件系统和对象存储魔力象限,前三名提供商分别是Dell EMC.IBM.Scalitu. 这项研究定义了分布式文件系统和对象存储是"提供了对象以及/或者横向扩展文件技术的软件和硬件解决方案,解决非结构化数据增长的需求,是基于'无共享架构的'". 除了前三名的厂商之外,领导者象限没有其他入围厂商了.HDS是唯一一个"挑战者",Red Hat和SwiftStack是唯一一个"远见者". 在这个魔力象限中,有超过半数也就是

非预定监控对象还是被国安局网获?

美国<华盛顿邮报>5日披露,美国国家安全局拦截的电子通信数据来源中,包括美国人在内普通网民数量远远多于被列为合法监控对象的外籍人士. 这家报纸的结论依据对国家安全局前雇员爱德华・斯诺登提供的电子数据进行4个月研究后得出.斯诺登提供了一个巨大缓冲存储器,里面存有国安局拦截的大量电子数据. 按照这家报纸的说法,数据中包含大约16万则电子邮件和实时通信信息以及从超过1.1万个网络账户中获取的7900份文件,拦截时间为美国总统贝拉克・奥巴马的第一个任期内,即2009年至2012年. 这家报纸得出结论,

webtail 文件读取,文件监控,websocket

文件读取 先介绍下背景,之前遇到过服务器上需要长时间tail一个日志,之前经常是通过一个终端连到服务器上,但是对于长时间观察,就不太方便:老是要开着终端,没法用手机等移动设备查看:多人共享查看比较麻烦,都需要登录到服务器上. webtail实现类似于tail,能够持续读取一个文件,并将文件内容通过websocket,实时推送到web端.webtail文件读取基于linux的inotify,所以没有可移植性,websocket使用基于asio的websocketpp,代码维护在这里. webtai

在Word 2010中插入链接到文件的对象

在Word 2010文档中可以插入链接到文件的对象,当被链接的原始文件更新后,插入到Word文档中的对象也将同步更新.而嵌 入到Word文档中的文件无法实现与原始文件的同步更新.在Word 2010文档中插入链接到文件的对象步骤如下所述: 第1步,打开Word 2010文档窗口,将插入条光标定位到需要插入对象的位置.切换到"插入"功能区,在" 文本"分组中单击"对象"按钮,如图2011081704所示. 图2011081704 单 击"

在Word2010中插入链接到文件的对象

在Word2010文档中可以插入链接到文件的对象,当被链接的原始文件更新后,插入到Word文档中的对象也将同步更新.而嵌入到Word文档中的文件无法实现与原始文件的同步更新.在Word2010文档中插入链接到文件的对象步骤如下所述: 第1步,打开Word2010文档窗口,将插入条光标定位到需要插入对象的位置.切换到"插入"功能区,在"文本"分组中单击"对象"按钮,如图1所示. 图1 单击"对象"按钮第2步,打开"对象

关于生成Excel文件的对象

问题描述 我想得到一个Excel文件中某个Sheet的一些信息,是不是得先生成一个Excel文件的对象呢,这要引入哪些命名空间呀,改怎么办呢,请高手指点,谢谢! 解决方案 解决方案二:好像要添加对Office里EXCEL的引用.然后用命名空间excel即可,可以用Excel对象.解决方案三:要添加excel.dll这个引用,具体这个文件怎么生成可以去网上找找接分

vector-JAVA中Vector从.dat文件读取对象怎么做到的

问题描述 JAVA中Vector从.dat文件读取对象怎么做到的 用以下方法读的.dat文件 FileInputStream fi=new FileInputStream("stu.dat"); ObjectInputStream si=new ObjectInputStream(fi); .dat的文件,里面存了多个学搜索生信息,包括姓名,学号等,怎么从文件中读出并且写入Vector中 主要是不能确定学生对象的个数,所以选择用Vector,但是又不知道怎么写 ,我查了些资料,那些书里