利用FileWatcher实现文件实时监视

FileWatcher能实现对某一目录的文件(新建,改名,内容修改,删除)的实时监视

using System;
using System.IO;
using System.Windows.Forms;

namespace Fw
{
 public partial class frm1 : Form
    {
 private FileSystemWatcher watcher;
 private delegate void UpdateWatchTextDelegate(string newText);


 public frm1()
        {
            InitializeComponent();
 this.watcher = new FileSystemWatcher();
 this.watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
 this.watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
 this.watcher.Changed += new FileSystemEventHandler(watcher_Changed);
 this.watcher.Created += new FileSystemEventHandler(watcher_Created);

        }

 public void UpdateWatchText(string newText)
        {
            lblWatch.Text = newText;
        }


 public void WriteLog(string LogContent) 
        {
 using (StreamWriter sw = new StreamWriter("c:\\Log.txt", true))
            {
                sw.WriteLine(LogContent);
                sw.Close();
            } 
 
        }

 void watcher_Created(object sender, FileSystemEventArgs e)
        {           
 try
            {
                WriteLog(String.Format("File: {0} Created", e.FullPath));
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "文件" + e.FullPath + "被创建");
            }
 catch (IOException)
            {
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "创建日志写入失败!");
            }
        }


 void watcher_Changed(object sender, FileSystemEventArgs e)
        {            
 try
            {              
                WriteLog(String.Format("File: {0} {1}", e.FullPath, e.ChangeType.ToString()));
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "文件" + e.FullPath + "被修改");
            }
 catch (IOException)
            {
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "修改日志写入失败!");
            }
        }

 void watcher_Renamed(object sender, RenamedEventArgs e)
        {            
 try
            {               
                WriteLog(String.Format("File renamed from {0} to {1}", e.OldName, e.FullPath));
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "文件" + e.OldName + "被重命名为" + e.FullPath);
            }
 catch (IOException)
            {
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "重命名日志写入失败!");
            }
        }

 void watcher_Deleted(object sender, FileSystemEventArgs e)
        {            
 try
            {                
                WriteLog(String.Format("File: {0} Deleted", e.FullPath));
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "文件" + e.FullPath + "被删除");
            }
 catch (IOException)
            {
 this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), "删除日志写入失败!");
            }
        }


 private void cmdBrowse_Click(object sender, EventArgs e)
        {
 if (this.folderBrowserDialog1.ShowDialog() != DialogResult.Cancel)
            {
                txtLocation.Text = this.folderBrowserDialog1.SelectedPath;
                cmdWatch.Enabled = true;
            }
        }

 private void cmdWatch_Click(object sender, EventArgs e)
        {
 if (txtLocation.Text.Length <= 0) 
            {
                MessageBox.Show("请先选择要监视的文件夹!");
                cmdBrowse.Focus();
 return;
            }
            watcher.Path = txtLocation.Text;//监控路径(文件夹)
            watcher.Filter = "*.*";//如果filter为文件名称则表示监控该文件,如果为*.txt则表示要监控指定目录当中的所有.txt文件
            watcher.NotifyFilter = NotifyFilters.LastWrite |
                NotifyFilters.FileName |
                NotifyFilters.Size;
            lblWatch.Text = watcher.Path + " 监视中";

 //begin watching.
            watcher.EnableRaisingEvents = true;
        }

 private void btnStop_Click(object sender, EventArgs e)
        {
            watcher.EnableRaisingEvents = false;
            lblWatch.Text = watcher.Path + " 监视已经停止!";
        }




    }
}

注:如果目录下还有子目录,FileWatcher默认情况下并不能监视到子目录下的文件,可以通过设置watcher.IncludeSubdirectories = true; 解决这个问题

源代码下载:http://files.cnblogs.com/yjmyzz/FileWatcher.rar

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

socket中的byte消息格式设计

这二天在研究webabcd的socket多人聊天室,想尝试增加一些功能,比如:允许用户除发送文字外,还能发送图片或文件。 问题: socket发送数据时,只能发...

20470
来自专栏DOTNET

.Net多线程编程—误用点分析

1 共享变量问题 错误写法: 所有的任务可能会共享同一个变量,所以输出结果可能会一样。 1 public static void Error() 2 { 3 ...

34980
来自专栏张善友的专栏

自定义Unity对象生命周期管理集成ADO.NET Entity Framework

在Unity中,从Unity 取得的实例为 Transient。如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一...

36880
来自专栏Porschev[钟慰]的专栏

asp.net生成静态页

做个生成静态页示例: 采用替换模版页的形式生成静态页 第一步:新建项目,创建一个简单模版页:TemplatePage.htm <!DOCTYPE html PU...

22760
来自专栏更流畅、简洁的软件开发方式

借用 疯狂秀才 的页面,修改了一下自然框架后台管理的页面。

  不知道为什么,就是不喜欢extJS,昨天看到了疯狂秀才的页面,大家都说好,那我就借鉴一下吧。下载源码,加到aspx里面。运行,居然有js错误。一模一样的呀,...

32670
来自专栏恰童鞋骚年

自己动手写一个简单的MVC框架(第一版)

  路由(Route)、控制器(Controller)、行为(Action)、模型(Model)、视图(View)

15920
来自专栏大内老A

我所理解的Remoting(1):Marshaling & Activation[下篇]

在上面一片文章,我花了大量的文字来来描述了Remote Object如何通过Marshaling的过程从Server端所在的Application Domain...

22960
来自专栏大内老A

ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II

二、ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I) 现在我们真正进入ASP....

21280
来自专栏岑玉海

RavenDb学习(九)高级特性下半部分

1.聚合缓存 RavenDb默认是缓存所有的请求url的,最大的缓存请求数默认是2048 documentStore.Conventions.ShouldCa...

32150
来自专栏菩提树下的杨过

XmlSpy / XSD 以及 验证

很早以前看过一句话:“XML就象空气”,在企业应用开发中XML是一个重要的数据交换标准。而XSD则可以用来校验XML的数据格式是否正确。 一个典型的XSD文件如...

243100

扫码关注云+社区

领取腾讯云代金券