C# FileSystemWatcher 在监控文件夹和文件时的用法

概述

最近学习FileSystemWatcher的用法,它主要是监控一个文件夹,当文件夹内的文件要是有更改就要记录下来,我就整理下我对FileSystemWatcher 的理解和用法.

FileSystemWatcher 用法

在应用FileSystemWatcher对象之前,你必须了解这个对象的一些基本属性和事件。毫无疑问,这个对象的最重要的属性为“EnableRaisingEvents”属性。

这个属性决定对象在收到改变通知时是否提交事件。如果EnableRaisingEvents属性设为假,对象将不会提交改变事件。如果设为真,它将提交改变事件。下面是你在应用FileSystemWatcher对象时将要用到的其它一些重要属性/事件:

属性:

Path——这个属性告诉FileSystemWatcher它需要监控哪条路径。例如,如果我们将这个属性设为“C:Temp”,对象就监控那个目录发生的所有改变。 
IncludeSubDirectories——这个属性说明FileSystemWatcher对象是否应该监控子目录中发生的改变。 
Filter——这个属性允许你过滤掉某些类型的文件发生的变化。例如,如果我们只希望在TXT文件被修改/新建/删除时提交通知,可以将这个属性设为“*txt”。在处理高流量或大型目录时,使用这个属性非常方便。 
事件

Changed——当被监控的目录中有一个文件被修改时,就提交这个事件。值得注意的是,这个事件可能会被提交多次,即使文件的内容仅仅发生一项改变。这是由于在保存文件时,文件的其它属性也发生了改变。 
Created——当被监控的目录新建一个文件时,就提交这个事件。如果你计划用这个事件移动新建的事件,你必须在事件处理器中写入一些错误处理代码,它能处理当前文件被其它进程使用的情况。之所以要这样做,是因为Created事件可能在建立文件的进程释放文件之前就被提交。如果你没有准备正确处理这种情况的代码,就可能出现异常。 
Deleted——当被监控的目录中有一个文件被删除,就提交这个事件。 
Renamed——当被监控的目录中有一个文件被重命名,就提交这个事件。 
注:如果你没有将EnableRaisingEvents设为真,系统不会提交任何一个事件。如果有时FileSystemWatcher对象似乎无法工作,请首先检查EnableRaisingEvents,确保它被设为真。

事件处理

当FileSystemWatcher调用一个事件处理器时,它包含两个自变量——一个叫做“sender”的对象和一个叫做“e”的FileSystemEventArgs对象。我们感兴趣的自变量为FileSystemEventArgs自变量。这个对象中包含有提交事件的原因。以下是FileSystemEventArgs对象的一些属性:

属性:

Name——这个属性中使事件被提交的文件的名称。其中并不包含文件的路径——只包含使用事件被提交的文件或目录名称。 
ChangeType——这是一个WatcherChangeTypes,它指出要提交哪个类型的事件。其有效值包括:Changed、Created、Deleted、Renamed 
FullPath——这个属性中包含使事件被提交的文件的完整路径,包括文件名和目录名。

FileSystemWatcher对象为你完成目录监控工作。如果新建、更新或删除一个文件,FileSystemWatcher将提交一个事件,通知你发生了一项改变。这样,新建一个文件后,你的程序立即就知道可以使用这个文件。立即通知改变使得你的系统以更高的效率工作,因为你不能总是“调查”目录中发生的改变,而且在两次目录扫描之间也不会有时间流失。

示例:


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

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

class Program

   {

       static void Main(string[] args)

       {

           WatcherStrat(@"D:\spring\Program", "*.*");

           Console.ReadKey();

       }

       private static void WatcherStrat(string path, string filter)

       {

           FileSystemWatcher watcher = new FileSystemWatcher();

           watcher.Path = path;

           watcher.Filter = filter;

           watcher.Changed += new FileSystemEventHandler(OnProcess);

           watcher.Created += new FileSystemEventHandler(OnProcess);

           watcher.Deleted += new FileSystemEventHandler(OnProcess);

           watcher.Renamed += new RenamedEventHandler(OnRenamed);

           watcher.EnableRaisingEvents = true;

           watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess

                                  | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;

           watcher.IncludeSubdirectories = true;

       }

       private static void OnProcess(object source, FileSystemEventArgs e)

       {

           if (e.ChangeType == WatcherChangeTypes.Created)

           {

               OnCreated(source, e);

           }

           else if (e.ChangeType == WatcherChangeTypes.Changed)

           {

               OnChanged(source, e);

           }

           else if (e.ChangeType == WatcherChangeTypes.Deleted)

           {

               OnDeleted(source, e);

           }

       }

       private static void OnCreated(object source, FileSystemEventArgs e)

       {

           Console.WriteLine("文件新建事件处理逻辑 {0}  {1}  {2}", e.ChangeType, e.FullPath, e.Name);

       }

       private static void OnChanged(object source, FileSystemEventArgs e)

       {

           Console.WriteLine("文件改变事件处理逻辑{0}  {1}  {2}", e.ChangeType, e.FullPath, e.Name);

       }

       

       private static void OnDeleted(object source, FileSystemEventArgs e)

       {

           Console.WriteLine("文件删除事件处理逻辑{0}  {1}   {2}", e.ChangeType, e.FullPath, e.Name);

       }

       

       private static void OnRenamed(object source, RenamedEventArgs e)

       {

           Console.WriteLine("文件重命名事件处理逻辑{0}  {1}  {2}", e.ChangeType, e.FullPath, e.Name);

       }

   }

运行结果

总结

1、重命名会触发两个事件,Renamed和Changed。

2、FileSystemWatcher对NTFS和FAT32的磁盘监控的效果都是一样吗?

时间: 2024-08-03 22:28:35

C# FileSystemWatcher 在监控文件夹和文件时的用法的相关文章

使用FileSystemWatcher监控文件夹及文件

引言 这一周主要精力集中学习一个同事开发的本地文件搜索项目上,其中客户端添加共享文件时主要是使用FileSystemWatcher 监控文件,并在各种事件发生时向服务器发送消息. 解决方法 FileSystemWatcher类以前也使用过,没有太仔细去观察,这次使用时才发现其事件提示会很有趣: a):当你添加文件或文件夹时,会触发Created事件,然后修改默认文件夹或文件名称再触发Changed事件. b):复制或移动文件夹文件时则是触发Created事件. c):删除文件夹或文件时触发Del

android开发步步为营之54:读取assets,raw文件夹下文件

一.读取assets文件下文件products.json public String readAssetFile(Context c, String file) { Elapsed profiler = new Elapsed(); BufferedReader bufReader = null; try { InputStreamReader inputReader = new InputStreamReader(c.getResources().getAssets().open(file))

【Android】14.3 浏览手机中的所有文件夹和文件

分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 前面我们了解了内部存储.外部存储的含义,用一句话说,内部存储实际上是保存在"data"文件夹下,外部存储(SD卡)实际是保存在"sdcard"或者"storage"文件夹下. 这个例子演示如何将这些内部存储和外部存储的文件夹及其子文件架下的文件全部显示出来,类似于树形结构一层一层地向下看(例子没有实现返回上层的功能,或者说,仅仅实现了Android自带的文件浏览

使用IO流实现对特殊文件及文件夹中文件拷贝到指定文件中

本程序可以实现将自己指定的文件类型的文件拷贝到自己想放的文件中,比如一个文件夹中有很多文件,那么我们想把所有的TXT文件拷贝到自己指定的文件中.(靠背笔记) package com.blueZhang; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept

Linux下压缩某个文件夹(文件夹打包)

tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件.zip 压缩方法:压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归zip [参数] [打包后的文件名] [打包的目录路径]解压 unzip xahot.zip 不解释linux zip命令的基本用法是:linux zip命令参数列表:-a 将文件转成ASCI

JAVA之IO技术-获取指定目录下的文件夹和文件的File对象或是字符串名称。

package ioTest.io3; /* * 获取指定目录下的文件夹和文件的File对象或是字符串名称. * 也可以通过filter获取指定的文件夹或者指定类型的文件 * 这里面需要做一个总结,如何利用jdk的源码去理解不熟悉的方法的应用. */ import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; public class FileDemo2 { public static void m

JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件

package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要显示文件目录的层级 * 注:运用了递归的算法. */ public class FileDemo3 { public static void main(String[] args) { File dir=new File("F:\\黑马学习日程\\"); //File dir=new Fi

在source insight project中删除文件夹或者文件的通用方法

1.删除文件夹或者文件在硬盘上的数据 2.project->synchronize files...看到如下图,然后勾选remove missing files from project

Linux统计某文件夹下文件、文件夹的个数

统计某文件夹下文件的个数 ls -l |grep "^-"|wc -l 统计某文件夹下目录的个数 ls -l |grep "^d"|wc -l 统计文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 如统计/home/han目录(包含子目录)下的所有js文件则: ls -lR /home/han|grep js|wc -l 或 ls -l "/home/han"|grep "js&qu